[말랑 퀴즈] 26/03/29 해답

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 — 해답지 ✅

날짜: 2026-03-29 문제 수: 5문제


Q1. 🟡 보통

문제: 빈칸을 채우시오.

C++ 클래스 생성자 본문 안에서 멤버 변수에 값을 대입하는 방식은, 사용자 정의 타입 멤버의 경우 ①___ 가 먼저 호출된 뒤 ②___ 가 호출되는 비효율이 있다. 이를 해결하기 위해 ③___ 를 사용하면, ④___ 를 한 번만 호출하여 더 효율적으로 초기화할 수 있다.

정답:

① 기본 생성자(암시적 생성자) ② 복사 생성자(대입) ③ 초기화 리스트(멤버 초기화 리스트) ④ 복사 생성자

해설:

생성자 본문에서 theName = name; 처럼 대입하면, 컴파일러는 먼저 theName기본 생성자를 호출해 초기화한 뒤, 본문에서 다시 복사 대입 연산자를 호출한다. 이는 두 번의 생성자 호출로 비효율적이다.

반면 초기화 리스트(: theName(name))를 사용하면 복사 생성자 한 번만 호출되어 효율적이다. 클래스 멤버는 선언된 순서대로 초기화된다.

출처: game_dev/cpp/chapter1/2025-04-21-cpp_1_4.md


Q2. 🟡 보통

문제: C++에서 private 상속객체 합성(public 상속 + 멤버 변수) 중, private 상속을 반드시 사용해야 하는 경우를 고르시오.

  • A. “is-implemented-in-terms-of” 관계를 표현해야 하는 대부분의 경우
  • B. 기본 클래스의 protected 멤버에 접근하거나, 가상 함수를 재정의해야 할 때
  • C. 컴파일 의존성을 최소화하고 싶을 때
  • D. 파생 클래스에서 기본 클래스의 가상 함수를 재정의하지 못하도록 막고 싶을 때

정답: B

해설:

  • A (오답): “is-implemented-in-terms-of” 관계는 private 상속객체 합성 모두 표현 가능하며, 대부분의 경우 객체 합성이 권장된다.
  • B (정답): protected 멤버는 파생 클래스에서만 접근 가능하므로 객체 합성으로는 접근 불가. 가상 함수 재정의도 상속 없이는 불가능하다. 이 두 경우가 private 상속이 반드시 필요한 핵심 이유다. (공백 기본 클래스 최적화(EBO)도 해당)
  • C (오답): 컴파일 의존성 최소화는 객체 합성 + 포인터 방식(pImpl)이 더 유리하다.
  • D (오답): 가상 함수 재정의를 막으려면 private 상속 대신 중첩 클래스(객체 합성) 를 사용하는 것이 효과적이다. private 상속으로는 파생 클래스의 재정의를 막을 수 없다.

출처: game_dev/cpp/chapter6/2025-10-26-cpp_6_39.md


Q3. 🟢 쉬움

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

프라우드넷의 m_autoConnectionRecovery = true 설정을 사용하면, 와이파이가 끊겼다가 복구될 때 오프라인 동안 수신하지 못한 메시지는 영구 손실되어 다시 받을 수 없다.

정답: X

해설:

auto connection recovery 기능은 네트워크가 일시적으로 끊겼다가 복구될 때, 오프라인 동안 버퍼링된 메시지를 한꺼번에 수신하도록 설계되어 있다. 메시지는 손실되지 않으며, 연결 회복 후 일괄 전달된다. 클라이언트에서 m_autoConnectionRecovery = true로 설정하고 Connect를 호출하면 이 기능이 활성화된다.

출처: server/game_server/6/2026-02-23-game_server_6_5.md


Q4. 🟢 쉬움

문제: 빈칸을 채우시오.

아래 코드에서 a = b = c; 와 같은 연쇄 대입이 가능하려면, 대입 연산자와 복합 대입 연산자 모두 어떤 값을 반환해야 하는가?

class Widget {
public:
    Widget& operator=(const Widget& rhs) {
        // ...
        return ___; // ①
    }
    Widget& operator+=(const Widget& rhs) {
        // ...
        return ___; // ②
    }
    Widget& operator=(int rhs) {
        // ...
        return ___; // ③
    }
};

정답:

*this*this*this

해설:

C++에서 x = y = z = 15; 같은 연쇄 대입은 우측 연관 연산으로 x = (y = (z = 15)); 순서로 처리된다. 이를 가능하게 하려면 각 대입 연산자가 좌변 객체 자신의 참조자(*this)를 반환해야 한다. 이는 C++의 관례이며, +=, -=, *= 등 복합 대입 연산자와 매개변수 타입이 다른 operator=(int) 같은 경우에도 동일하게 적용된다.

출처: game_dev/cpp/chapter2/2025-05-30-cpp_2_10.md


Q5. 🔴 어려움

문제: 매치메이킹을 여러 로비 서버로 분산할 때, 로비 서버 간 데이터 불일치(스테일 데이터) 문제가 발생할 수 있다.

다음 상황에서 이 문제가 어떻게 발생하는지 설명하고, 해결 방법을 2가지 서술하시오.

상황:

  • 클라이언트 1은 로비 서버 1에 매칭 대기 중
  • 클라이언트 2~10은 로비 서버 2에 매칭 대기 중
  • 클라이언트 1이 매칭 취소를 요청하여 로비 서버 1은 이를 인지했으나, 해당 정보가 로비 서버 2에 아직 동기화되지 않은 상태

정답:

문제 발생 원리:

로비 서버 2는 클라이언트 1이 아직 매칭 대기 중이라는 스테일 데이터를 갖고 있으므로, 목표 인원이 충족됐다고 판단하여 배틀 서버에 게임방 생성을 지시한다. 이후 로비 서버 2가 로비 서버 1에게 “클라이언트 1을 게임방으로 보내라”고 지시하면, 클라이언트 1은 이미 매칭 취소를 했음에도 불구하고 원치 않는 게임방에 강제로 참여하게 된다. 동기화가 뒤늦게 이루어지기 때문에 이미 게임이 시작된 후이므로 막을 수 없다.

해결 방법:

  1. 자동 매치메이킹 재시작: 취소 요청이 뒤늦게 전파된 경우, 로비 서버 1이 로비 서버 2에 원상 복구를 알리고, 이미 배틀 서버로 이동 중인 클라이언트 2~10의 매치메이킹을 자동으로 재시작하도록 처리한다.

  2. 공유 메모리 저장 서버 활용: 모든 로비 서버가 별도의 메모리 저장 서버(공유 저장소) 에 직접 접근하여 플레이어 상태를 읽고 쓰는 방식으로, 서버 간 직접 동기화 없이도 항상 최신 데이터를 조회할 수 있다. 단, 데이터 접근마다 서버 간 통신이 발생하므로 로비 서버의 연산량이 많고 메모리 저장소 서버의 연산량이 적을 때 효과적이다.

출처: server/game_server/9/2026-03-27-game_server_10_3.md


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

댓글남기기