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

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

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


Q1. 🟢 쉬움

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

클래스 안에 string& 참조자 멤버와 const T 상수 멤버가 있더라도, 컴파일러는 복사 대입 연산자를 암시적으로 생성해 주므로 p = s; 같은 대입은 별도 정의 없이 그대로 컴파일된다.

출처: game_dev/cpp/chapter2/2025-04-22-cpp_2_5.md

📝 내 답: X. 복사 대입 연산자를 암시적 생성해주긴 한다. 각각 참조와 상수이기에 재할당해줄수 없으며, 컴파일 에러가 발생한다.
이 경우, 직접 복사 대입 연산자를 구현해주어야 한다.


Q2. 🟡 보통

게임 로직을 여러 서버에 나누는 비동기 분산 처리(서버 1이 서버 2에 명령만 보내고 결과를 기다리지 않는 방식)에 대한 설명으로 가장 올바른 것은?

Player_Attack(player, monster) {
	player.bullet--;
	otherServer.DamageCharacter(player.id, monster.id, 10);
}

DamageCharacter(callerServer, attacker, character, damage) {
	character.hitPoint -= damage;
	if(character.hitPoint < 0) {
		callerServer.GiveItem(attacker.id, gold, 30);
		DeleteEntity(character, 10sec);
	}
}
  • A. 서버 1은 서버 2의 처리 결과를 받을 때까지 대기하며, 그동안 플레이어 정보에 잠금을 건다.
  • B. 잠금으로 인한 병목이 없지만, 반환 값을 주고받을 수 없어서 모든 로직을 이 방식으로 구현하기는 어렵거나 불가능하다.
  • C. 서버 1과 서버 2가 각각 플레이어와 몬스터의 원본과 사본을 모두 가지고, 로직은 각 서버가 알아서 처리한다.
  • D. 분산 처리 전의 코드와 완전히 동일한 코드로 구현할 수 있다.

출처: server/game_server/9/2026-03-19-game_server_9_6.md

📝 내 선택: B.

A: 비동기 분산 처리이기에 서버 1은 대기하지 않고, 잠금을 걸지도 않는다.
C: 해당 방식은 데이터 분산 처리이다.
D: 함수 시그니처와 같은 것들이 변경되어야 하기에, 완전히 동일한 코드로 구현할 수 없다.


Q3. 🟢 쉬움

빈칸을 채우시오.

UML 다이어그램에 대한 설명이다.

  • 시퀀스 다이어그램에서 상호 작용의 주체인 ‘객체’(예: 클라이언트, 서버)는 ① ___ 모양의 도형으로 표현된다. (도형 이름 두 단어)
  • 시퀀스 다이어그램에서 객체들이 주고받는 ‘메시지’(예: Chat(), ShowChat())는 ② ___로 표현된다. (한 단어)
  • 액티비티 다이어그램에서 하나하나의 ‘활동 상태’는 ③ ___ 도형으로 표현된다. (도형 이름 한 단어)
  • 액티비티 다이어그램에서 “해커”인 경우와 “실제 사용자”인 경우처럼 경우를 나누어 흐름을 갈라지게 하는 구조를 ④ ___(이)라고 한다. (두 단어)

출처: server/game_server/5/2026-02-12-game_server_5_1.md

📝 내 답: 네모, 선, 원, 분기


Q4. 🔴 어려움

C++에서 swap을 직접 만든 타입(pImpl 포인터를 가진 Widget)에 맞게 지원하는 방법에 대해 답하시오.

(1) Widget이 클래스 템플릿이 아닐 때, std::swap을 Widget에 대해 완전 특수화하여 그 안에서 swap(a.pImpl, b.pImpl);을 직접 호출하면 컴파일되지 않는다. 그 이유와 해결 방법을 쓰시오.

(2) Widget이 클래스 템플릿(Widget<T>)일 때, std::swap을 Widget<T>에 대해 부분 특수화하는 코드는 왜 동작하지 않는가?

(3) 아래 코드는 컴파일은 되지만 문제가 있다. 어떤 문제인지 쓰시오.

namespace std {
	template<typename T>
	void swap(Widget<T>& a, Widget<T>& b) {
		a.swap(b);
	}
}

(4) 클래스 템플릿인 경우의 올바른 해결 방법에서, 비멤버 swap은 어디에 두어야 하는가? 그리고 사용자 코드에서 swap을 호출할 때 std::swap(obj1, obj2); 대신 어떻게 호출해야 하며, 그 이유는 무엇인가?

출처: game_dev/cpp/chapter4/2025-07-02-cpp_4_25.md

📝 내 풀이: (1) pImpl은 private 접근 지정자에 있기 때문이다. 클래스 내에 swap 멤버 함수를 두고, 완전 특수화한 swap 함수가 클래스 내의 swap 멤버 함수를 호출하도록 구현한다.

(2) C++에서는 클래스 템플릿에 대한 부분 특수화는 허용하지만, 함수 템플릿에 대해서는 허용하지 않는다.

(3) 2에서 말했던 함수 템플릿에 대한 부분 특수화이기 떄문이다.

(4) 같은 네임스페이스 안에 두어야 한다. using std::swap; swap(a, b); 와 같이 사용한다. C++이 swap을 탐색하는 순서 때문이다.


Q5. 🟡 보통

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

널 포인터를 의미하는 0이나 NULL을 보편 참조(T&&)를 쓰는 완벽 전달 함수 템플릿 fwd에 넘기면, 컴파일러는 이를 포인터 타입으로 추론하므로 f를 직접 호출했을 때와 똑같이 널 포인터로 완벽하게 전달된다.

출처: game_dev/moderncpp/5/2026-09-29-moderncpp_5_30.md

📝 내 답: X. forward 함수의 인자에는 remove_reference가 있는데, 주소 값이 애초에 없는 값이라 에러가 발생했던 것으로 기억한다.


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

빈칸을 채우시오.

게임 서버가 MongoDB 샤드 클러스터(수평 확장 구조)를 사용한다. 각 구성과 동작에 대한 설명이다.

  • 애플리케이션 서버에서 받은 명령을 적절한 샤드로 보내고 결과를 받아 오는 라우터 역할의 프로그램은 ① ___이다. (영문 소문자 프로그램 이름)
  • 샤드 목록, 컬렉션의 샤딩 키 정보, 청크 분포 같은 샤드 클러스터 전체의 메타데이터를 저장하는 서버는 ② ___이다. (영문 이름)
  • 어떤 도큐먼트를 어느 샤드에 저장할지는, 샤드 키를 ③ ___ 함수에 넣어 나온 정수 값으로 정한다. (한 단어)
  • ②가 죽으면 모든 샤드가 죽으므로, 예비 데이터베이스를 두는 ④ ___을(를) 하도록 되어 있다. (복제본 집합(replica set)으로 구성하는 방식을 가리키는 한 단어)

출처: server/game_server/8/2026-03-13-game_server_8_8.md 오답노트: wn-c830945a · 2026-09-15 최초 오답 · 이번이 2번째 복습

📝 내 답: mongos, configdb, 해시, 복제


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

댓글남기기