[말랑 퀴즈] 26/09/10 문제

게시:     수정

카테고리:

태그:

제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.

말랑말랑 퀴즈 📝

날짜: 2026-09-10 문제 수: 6문제


Q1. 🔴 어려움

C++의 const 키워드에 대한 문제다.

(1) 아래 네 선언은 각각 무엇을 수정할 수 있고 무엇을 수정할 수 없는지 쓰시오. 그리고 const*를 기준으로 어디에 있느냐가 무엇을 가르는지 한 문장으로 정리하시오.

char greeting[] = "Hello";

char       *       p = greeting;   // ㉠
const char *       p = greeting;   // ㉡
char       * const p = greeting;   // ㉢
const char * const p = greeting;   // ㉣

(2) 반복자에도 같은 구분이 있다. 아래 두 선언 중 어느 쪽이 T* const처럼 동작하고 어느 쪽이 const T*처럼 동작하는지 고르고, 각각에서 *it = 10;++it; 중 무엇이 되고 무엇이 안 되는지 쓰시오.

const std::vector<int>::iterator  iter  = vec.begin();   // ㉮
std::vector<int>::const_iterator  cIter = vec.begin();   // ㉯

(3) 아래 두 operator[]const가 붙고 안 붙고의 차이뿐인데도 오버로딩이 성립한다. 각각 어떤 객체에 대해 호출되는지 쓰고, 함수 뒤에 붙은 const 가 무엇을 뜻하는지 설명하시오.

class TextBlock {
public:
    const char& operator[](size_t position) const { return text[position]; }   // (1)
    char&       operator[](size_t position)       { return text[position]; }   // (2)
private:
    std::string text;
};

(4) 아래 코드는 멤버 함수가 const인데도 컴파일 에러가 난다.

class CTextBlock {
public:
    size_t length() const;
private:
    char*  pText;
    size_t textLength;
    bool   lengthIsValid;
};

size_t CTextBlock::length() const {
    if (!lengthIsValid) {
        textLength    = strlen(pText);   // ❌ 에러!
        lengthIsValid = true;            // ❌ 에러!
    }
    return textLength;
}
  • ㉠ 이 에러의 근거가 되는 상수성 개념의 이름은 무엇인가? 그리고 그와 대비되는 다른 상수성 개념은 무엇인가?
  • ㉡ 위 코드를 고치려면 어떤 키워드를 어디에 붙여야 하는가?

출처: game_dev/cpp/chapter1/2025-04-06-cpp_1_3.md

📝 내 풀이:

(1) ㄱ: 포인터 O, 값 O
ㄴ: 포인터 O, 값 X
ㄷ: 포인터 X, 값 O
ㄹ: 포인터 X, 값 X

*를 기준으로 좌측이면 값, 우측이면 포인터

(2) 이건 예상과 달랐던 것 같다.
아마 (가)는 T* const처럼 동작하며, *it = 10;만 가능,
(나)가 const T*처럼 동작하며, ++it;만 가능했던 것으로 기억한다.

(3) 1번은 const TextBlock 타입의 객체, 2번은 TextBlock의 객체
const를 지정하면 내부에서 변수를 수정하지 못한다.

(4) ㄱ: 무슨 상수성 개념이 있었냐는 기억이 안난다. 이게 안되는 이유는 함수에 const가 붙여져 있기 때문이다. ㄴ: mutable 키워드를 pText, textLength의 타입 앞에 붙여야 한다.


Q2. 🔴 어려움

게임에서 실제 레이턴시를 줄이는 방법에 대한 설명으로 가장 올바른 것은?

  • A. TCP는 패킷 유실이 발생하면 재전송을 위한 지연이 생겨 스터터링을 유발하므로, 캐릭터 이동 메시지처럼 실시간성이 중요한 데이터에는 UDP가 적합하다. 한편 메시지를 뭉쳐서 보낼 때는 뭉치는 시간이 길수록 패킷 수가 줄어 유리하므로, 100ms 이상 모았다가 한 번에 보내는 것이 권장된다.
  • B. C/S 네트워킹과 P2P 네트워킹은 언제나 함께 쓰는 것이 최선이다. 게임 서버를 여러 지역에 분포시켜 가까운 서버에 매칭시키더라도, P2P를 함께 써야 레이턴시를 조금이라도 더 줄일 수 있기 때문이다.
  • C. 레이턴시를 줄이는 방법은 크게 ① TCP 대신 UDP 사용 ② 적은 수의 패킷으로 전송 ③ 두 네트워킹 방식 혼용 세 가지다. 이 중 혼용은 서버는 멀고 두 클라이언트는 가까운 경우에 효과적이며, 이때 중요한 연산은 C/S로, 덜 중요한 연산은 P2P로 나누어 처리하면 효과적이다.
  • D. UDP는 패킷이 유실되어도 재전송 지연이 생기지 않는다. 따라서 아이템 획득이나 채팅처럼 반드시 도착해야 하는 데이터도 UDP로 보내는 편이 낫다. 유실되더라도 애플리케이션이 다시 요청하면 되므로, 어차피 TCP를 쓸 이유가 없다.

출처: server/game_server/5/2026-02-15-game_server_5_6.md

📝 내 선택: C. A: 이것은 레이턴시를 줄이는 법이 아닌, 통신량을 줄이는 방법이다. B: 정확히 기억은 안나지만, 언제나는 아니었던 것 같다. D: 정확한 전송이 필요한 데이터는 TCP로 보내야 한다. UDP는 전송을 보장하지 않는다.


Q3. 🟢 쉬움 · 📌 오답노트 (2번째 복습)

빈칸을 채우시오.

어느 게임 회사가 만든 대전 게임의 변천사다.

1998년   네트워크 기능이 아예 없었다. 한 대의 PC에서 혼자 플레이한다.

2001년   네트워크를 붙였지만 ① ___ 플레이만 가능했다. 두 사람이 직접 연결해서 겨룬다.

2005년   최대 8명이 함께 플레이할 수 있게 되었다. 그런데 회사가 서버를 운영하지는 않았고,
         방을 만든 사람의 PC가 서버 역할을 겸했다.
         → 이런 방식을 ② ___ 방식이라 하고, 서버 역할을 겸하는 그 사람을 ③ ___ 라 부른다.

2010년   회사가 전용 서버 프로그램을 만들어 24시간 가동하기 시작했다.
         이 프로그램은 게임 플레이에 참여하지 않으며, 렌더링과 사용자 입력 처리도 하지 않는다.
         순전히 클라이언트의 연결만 처리한다.
         → 이를 ④ ___ 서버라 한다.

2005년 방식에는 유저 불만이 두 가지 쏟아졌다. 하나는 ③ 가 게임에도 함께 참여하다 보니 그쪽이 유리하다는 ⑤ ___ 문제였고, 다른 하나는 ③ 가 도중에 나가 버리면 판이 통째로 깨진다는 문제였다. 2010년의 변화는 이 두 불만을 한꺼번에 해결한 것이다.

출처: server/game_server/4/2026-02-08-game_server_4_1.md 오답노트: wn-2cb31e69 · 2026-09-09 최초 오답 · 이번이 2번째 복습

📝 내 답: 1:1, 세션, 호스트, 데디케이티드, 형평성


Q4. 🟡 보통

다음 명제가 참(O)인지 거짓(X)인지 판단하라.

블로킹이란 디바이스에 처리 요청을 걸고 응답을 대기하는 함수를 호출할 때, 스레드에서 발생하는 대기 현상이다. 예를 들어 ReadFile()을 호출하면 디스크 처리가 완전히 끝날 때까지 애플리케이션은 대기 상태로 남는다.

이때 그 스레드는 waitable state가 되며, CPU 사용량이 0% 가 된다.

그런데 CPU 사용량이 0%라는 것은 그 스레드가 CPU를 조금도 쓰지 않는다는 뜻이므로, 블로킹은 성능 면에서 손해가 없다. 오히려 바쁜 대기(busy wait)와 달리 자원을 아끼는 방식이다. 신경 쓸 부분은 코드 가독성 정도이며, 네트워크 수신에서도 상대가 데이터를 보내지 않으면 함수가 적절히 타임아웃되어 리턴하므로 문제되지 않는다.

출처: server/game_server/3/2025-12-16-game_server_3_1.md

📝 내 답: O. Ready, Wait, 등이 있었던 것 같은데 정확히 기억이 안난다.


Q5. 🟡 보통

멀티스레드 프로그래밍이 필요한 상황에 대한 문제다.

(1) 멀티스레딩이 필요한 상황은 크게 세 가지다. 무엇인지 쓰시오.

(2) 게임 로딩 화면을 예로 들어 보자. 배경 이미지는 부드럽게 움직이면서 그 뒤에서 리소스가 로드되어야 한다.

// [싱글스레드]
LoadScene() {
    Render();
    LoadScene();
    Render();
    LoadModel();
    Render();
    LoadTexture();
    Render();
    LoadAnimation();
    Render();
    LoadSound();
}
// [멀티스레드]
bool isStillLoading;

Thread1 {
    isStillLoading = true;
    while (isStillLoading) {
        FrameMove();
        Render();
    }
}

Thread2 {
    LoadScene();  LoadModel();  LoadTexture();
    LoadAnimation();  LoadSound();

    isStillLoading = false;
}
  • ㉠ 싱글스레드 쪽 코드의 문제점 두 가지를 쓰시오.
  • ㉡ 멀티스레드 쪽에서 두 스레드가 각각 무슨 역할을 맡는지, 그리고 isStillLoading이 무엇을 위한 변수인지 쓰시오.

(3) 요즘 CPU는 클록 속도보다 코어 수가 중요해졌다.

  • ㉠ 왜 그런가? (클록 속도와 코어 수가 각각 어떤 추세인지 밝히시오.)
  • ㉡ 4코어 CPU에서 싱글스레드 프로그램을 돌리면 CPU 사용량이 대략 몇 %로 나타나는가?
  • ㉢ 아래는 멀티스레드로 소수를 구하는 코드인데 실행하면 에러가 난다. 어느 줄이 문제이며 왜인가?
int num = 1;
std::vector<int> primes;

for (int i = 0; i < ThreadCount; i++) {
    std::shared_ptr<std::thread> t(new std::thread([&]() {
        while (true) {
            int n = num;
            num++;

            if (n >= MaxCount) break;

            if (IsPrimeNumber(n)) {
                primes.push_back(n);
            }
        }
    }));
    threads.push_back(t);
}

출처: server/game_server/1/2025-05-28-game_server_1_3.md

📝 내 풀이:

(1) 단일 작업이 아님, 입출력 필요, 모르겠다.

(2) ㄱ: 끊김 현상, 다른 작업 불가
ㄴ: Thread1은 업데이트 및 렌더, Thread2는 로딩을 맡는다.
isStillLoading은 로딩중인지 판단한다. 정확히 모르겠다.

(3) ㄱ: 클럭 속도는 로그 함수의 형태로 한계에 도달했다. 그래서 코어 수를 올리는 추세다.
ㄴ: 25%로 나타난다. 코어 하나밖에 쓰지 않기 때문
ㄷ: mutex를 사용하지 않아서 생긴 문제다. 가장 큰 문제는 배열의 주소는 재할당되기 때문에 생긴다.


Q6. 🟡 보통

빈칸을 채우시오.

분산 처리는 서버 한 대가 할 일을 여러 대로 나누는 것이다. 흔히 처리량을 늘리는 ① ___ 을(를) 떠올리지만, 그것만이 아니다. 서버가 한 대뿐이라면 그 한 대가 멈추는 순간 서비스 전체가 멈추므로, 분산은 ② ___ 에도 효과를 준다.

다만 한 대가 멈췄을 때 무엇이 보장되는지는 나누는 방식에 따라 다르다.

방식 나누는 기준 한 대가 중지되면
___ 분산 같은 일을 하는 서버를 여러 대 둔다 그 서버에 있던 플레이어들만 접속이 끊어진다. 그들은 다른 서버에 접속하면 된다
___ 분산 기능별로 서로 다른 서버에 맡긴다 중지된 서버가 처리하던 그 기능 외의 다른 기능은 정상 작동한다

출처: server/game_server/9/2026-03-22-game_server_9_11.md

📝 내 답: 서버 업그레이드, 안정성, 수평, 수직


MallangQuiz 카테고리 내 다른 글 보러가기

댓글남기기