[말랑 퀴즈] 26/10/13 문제
카테고리: MallangQuiz
태그: Quiz
제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.
말랑말랑 퀴즈 📝
날짜: 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, 해시, 복제
댓글남기기