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

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

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


Q1. 🟢 쉬움

빈칸을 채우시오.

MongoDB 클라이언트를 쓸 때는 먼저 ① ___(을)를 매개변수로 연결 객체를 만들고, 그다음 ② ___(을)를 매개변수로 DB 인스턴스 액세스를 얻고, 그다음 ③ ___(을)를 매개변수로 컬렉션 액세스 객체를 얻는다. 도큐먼트를 삽입할 때는 ④ ___(이)라는 이진 형식의 객체를 사용하는데, 이는 JSON과 같은 역할을 하지만 ⑤ ___ 구조를 쓴다는 차이가 있다.

출처: server/game_server/8/2026-03-14-game_server_8_9.md

📝 내 답: 엔드포인트, 연결 객체, DB 인스턴스, BSON, 바이너리


Q2. 🔴 어려움

핸들 반환에 대해 답하시오.

struct RectData {
    Point ulhc; // 좌측 상단
    Point lrhc; // 우측 하단
};

class Rectangle {
public:
    Point& upperLeft() const { return pData->ulhc; }
    Point& lowerRight() const { return pData->lrhc; }
private:
    shared_ptr<RectData> pData;
};

(1) ulhc, lrhc는 private 멤버인데도, 위 코드는 왜 캡슐화가 깨졌다고 평가되는가?

(2) upperLeft(), lowerRight()의 반환 타입에 const를 붙여 const Point& upperLeft() const로 고치면 어떤 문제가 해결되는가? 그런데도 왜 이것만으로는 충분하지 않은가?

(3) 아래 코드에서 무효참조 핸들(dangling handle) 문제가 왜 생기는가?

const Rectangle boundingBox(const GUIObject& obj);  // 값을 반환

GUIObject* pgo;
...
const Point* pUpperLeft = &(boundingBox(*pgo).upperLeft());

(4) 이 항목의 핵심 원칙은 “핸들을 반환하는 함수는 절대 쓰지 말라”는 것인가, 아니면 다른 뉘앙스인가?

출처: game_dev/cpp/chapter5/2025-07-10-cpp_5_28.md

📝 내 풀이:

(1) upperLeft와 lowerRight 함수에서 각 Point 객체의 참조를 반환하기 때문.

(2) const 객체, const 참조가 되어 변경이 불가능해진다.
Rectangle이 소멸되면, 반환한 참조가 댕글링된다.

(3) boundingBox(*pgo)를 통해 Rectangle 객체가 생성되지만, 괄호 밖으로 나가는 순간 소멸한다.

(4) 받아온 핸들을 다른 함수로 전달하여 사용하지 않는다.


Q3. 🟡 보통

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

프라우드넷에서 NetServer 클래스는 게임 클라이언트의 네트워크 모듈로, 서버에 연결을 맺고 메시지를 주고받으며 다른 클라이언트와 P2P 통신도 할 수 있다. 반면 NetClient 클래스는 게임 서버의 메인 모듈로, 클라이언트 연결을 받고 각 클라이언트의 네트워크 상황을 열람할 수 있다.

출처: server/game_server/6/2026-02-18-game_server_6_2.md

📝 내 답: X. NetServer과 NetClient 단어를 서로 바꿔야 맞다.


Q4. 🟡 보통

프라우드넷의 와이파이·셀룰러 연결 핸드오버(연결 유지) 기능에 대한 설명으로 가장 올바른 것은?

  • A. 연결 유지 기능(auto connection recovery)은 서버에서 기본적으로 켜져 있으며, 클라이언트에서는 별도 설정이 필요 없다.
  • B. 와이파이 지역을 벗어나 네트워크 통신이 일시적으로 멈추더라도, 연결이 회복되면 그동안 쌓인 메시지를 한 번에 받는다. 클라이언트는 OnServerOffline/OnServerOnline 이벤트로, 서버는 OnClientOffline()/OnClientOnline() 함수로 이를 알 수 있고, P2P 연결에서는 상대(peer)에 대해서도 OnP2PMemberOffline/OnP2PMemberOnline이 추가로 호출된다.
  • C. 연결이 끊기고 회복되는 동안 발생한 메시지는 유실되며, 애플리케이션이 별도로 재전송을 요청해야 한다.
  • D. P2P 연결에서는 별도의 오프라인/온라인 이벤트가 없으며, 서버-클라이언트 연결의 이벤트만으로 피어 상태를 알 수 있다.

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

📝 내 선택: B

A: 클라이언트에서 별도의 설정이 필요했던 것 같다.
C: 유실되지 않으며, 보관되었다가 한번에 받는다.
D: B에 설명한 것처럼 OnP2PMember~~ 과 관련된 함수가 있다.


Q5. 🔴 어려움

다중 상속에 대한 설명으로 가장 올바른 것은?

  • A. 두 기반 클래스에 이름이 같은 함수가 있으면, 한쪽이 public이고 다른 쪽이 private이라는 접근 지정자 차이만으로 컴파일러가 자동으로 모호성을 해결해 준다.
  • B. 죽음의 마름모꼴(Deadly Diamond) 문제는 가상 상속(virtual public)으로 기반 클래스 복사본을 하나로 줄여 해결할 수 있지만, 그 대가로 객체 크기 증가·접근 속도 저하·초기화 복잡도 증가라는 비용이 따른다. 그래서 꼭 필요할 때만 가상 상속을 쓰고, 쓰더라도 가상 기본 클래스에는 데이터를 두지 않는 것이 좋다.
  • C. CPerson이 IPerson은 private으로, PersonInfo는 public으로 상속한 이유는, 인터페이스 구현에는 재정의가 필요 없어 private을, 구현 도우미에는 다형적 확장이 필요해 public을 쓰기 때문이다.
  • D. 다중 상속은 항상 피해야 하며, 이펙티브 C++은 단일 상속만으로 설계할 것을 권장한다.

출처: game_dev/cpp/chapter6/2025-10-28-cpp_6_40.md

📝 내 선택: D

A: 이름이 같은 함수는 접근 지정자가 다르다 해도 영향을 받는다.
B: 죽음의 마름모꼴이라는 것은 기억나지만, 이걸 어떻게 해결했는지 정확히 기억나지 않는다.
C: private 상속을 하였더라도 재정의가 가능하다. 문제에 코드가 없어서 못보지만 아마 인터페이스 내부 함수/변수를 private로 두기 위함일 것이다. 구현 도우미는 다형적 확장(is-a 관계) public을 썼을 것이다.


Q6. 🟡 보통 · 📌 오답노트 (2번째 복습)

빈칸을 채우시오.

분산 처리는 ① ___뿐 아니라 ② ___에도 도움이 된다는 점에서, 단순히 서버 한 대의 성능을 올리는 ③ ___(과)는 다른 가치를 가진다. 수평 분산에서 서버 한 대가 멈추면 그 서버에 있던 플레이어는 접속이 끊기지만, ④ ___할 수 있어 완전히 게임을 못 하게 되는 것은 아니다. 수직 분산에서 서버 한 대가 멈추면, 다른 서버들은 ⑤ ___하지만 멈춘 서버가 맡았던 기능은 ⑥ ___.

출처: server/game_server/9/2026-03-22-game_server_9_11.md 오답노트: wn-5e7f462f · 2026-09-10 최초 오답 · 이번이 2번째 복습

📝 내 답: 확장성, 안정성, 수직 분산, 다른 서버에서 플레이, 정상 작동, 멈춘다.

답안이 여러가지 나올수 있어, 모호한 문제는 내지 못하게 해야겠다


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

댓글남기기