제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.
말랑말랑 퀴즈 📝
날짜: 2026-09-07
문제 수: 5문제
Q1. 🔴 어려움
features()는 위젯이 지원하는 기능들을 vector<bool>로 돌려준다. 각 원소는 특정 기능의 지원 여부를 뜻한다.
std::vector<bool> features(const Widget& w);
Widget w;
bool highPriority = features(w)[5]; // ✅ 정상 동작
processWidget(w, highPriority);
이 코드에서 형식만 auto로 바꿨다. 컴파일은 되는데 미정의 동작이 된다.
Widget w;
auto highPriority = features(w)[5]; // ⚠️ 컴파일은 되지만 미정의 동작
processWidget(w, highPriority);
(1) auto는 highPriority를 어떤 형식으로 추론하는가? 그리고 vector<bool>이 다른 vector<T>와 달리 그런 것을 반환할 수밖에 없는 이유를 설명하시오.
(2) 그 결과 미정의 동작이 되기까지의 과정을 ①~④ 순서대로 쓰시오. (features(w) 호출부터, 무엇이 무엇을 가리키다가 어떻게 망가지는지까지)
(3) 그렇다면 맨 위의 bool highPriority = ... 코드는 왜 안전한가? (2)와 무엇이 달라지는지 짚으시오.
(4) auto를 그대로 쓰면서 안전하게 만들려면 어떻게 고쳐야 하는가? 그 방법의 이름도 함께 쓰시오.
출처: game_dev/moderncpp/2/2026-04-08-moderncpp_2_6.md
📝 내 풀이:
<풀이를 여기에="" 작성하세요="">
---
## Q2. 🟡 보통
행렬 라이브러리에서 아래처럼 네 개를 연달아 더한다고 하자.
```cpp
Matrix sum = m1 + m2 + m3 + m4;
```
`operator+`가 매번 `Matrix`를 반환하면 임시 행렬이 계속 만들어져 비효율적이다. 그래서 **표현식 템플릿(expression template)** 기법을 쓰는 라이브러리는 `Matrix` 대신 `Sum<Matrix, Matrix>` 같은 **프록시 클래스 객체**를 반환하고, 그것들이 아래처럼 연쇄된다.
```cpp
// 실제 표현식의 형식은 이렇게 된다
Sum<Sum<Sum<Matrix, Matrix>, Matrix>, Matrix>
```
한편 아래 두 코드는 프록시와 아무 관련이 없다.
```cpp
double calcEpsilon();
float ep = calcEpsilon(); // (가)
auto ep = static_cast(calcEpsilon()); // (나)
```
이 두 가지 상황에 대한 설명으로 **가장 올바른 것**은?
- A. 표현식 템플릿에서 `operator+`가 프록시를 반환하는 것은 설계 실수다. `Matrix`를 직접 반환하도록 고쳐야 `auto`가 안전해지고 코드도 단순해진다.
- B. 프록시 클래스는 사용자가 **그 존재를 모르도록** 만드는 것이 좋고, 그래서 `Matrix`로의 **암묵적 변환**을 지원한다. 그런데 `auto`는 그 암묵적 변환을 일으키지 않고 프록시 형식을 그대로 붙잡으므로 `static_cast(...)`로 형식을 못 박아야 한다. 이 관용구는 프록시가 없는 (나)처럼 **변환이 의도된 것임을 드러내는 데**도 쓸 수 있다.
- C. `auto`가 위험해지는 것은 이런 프록시 클래스를 쓰는 외부 라이브러리에서만 생기는 문제다. 표준 라이브러리의 컨테이너만 쓴다면 `auto`를 마음 놓고 써도 된다.
- D. `static_cast`는 런타임 변환 비용을 발생시키므로, 형식이 걱정될 때는 `auto`를 쓰지 말고 (가)처럼 형식을 직접 적는 편이 항상 낫다. `auto`와 `static_cast`를 같이 쓰는 것은 결국 형식을 두 번 적는 셈이다.
> **출처:** `game_dev/moderncpp/2/2026-04-08-moderncpp_2_6.md`
**📝 내 선택:** ( )
---
## Q3. 🟡 보통
다음 명제가 참(O)인지 거짓(X)인지 판단하라.
> 어떤 게임이 **채팅·전투·거래**를 각각 다른 서버가 담당하도록 나눠 두었다. 어느 날 채팅 서버가 다운됐는데, 채팅만 되지 않을 뿐 전투와 거래는 정상적으로 돌아갔다. 이것은 **수직 분산**이 주는 안정성이다.
>
> 다른 게임은 **똑같은 일을 하는 필드 서버를 여러 대** 두고 플레이어를 나눠 담아 두었다. 필드 서버 2번이 다운되자 그 서버에 있던 플레이어들만 접속이 끊겼고, 그들은 다른 필드 서버에 접속해 계속 플레이할 수 있었다. 나머지 서버의 플레이어들은 아무 영향도 받지 않았다. 이것은 **수평 분산**이 주는 안정성이다.
>
> 두 사례는 분산 처리가 **확장성뿐 아니라 안정성에도** 효과를 준다는 것을 보여 준다.
> **출처:** `server/game_server/9/2026-03-22-game_server_9_11.md`
**📝 내 답:** O / X
---
## Q4. 🟢 쉬움
빈칸을 채우시오.
게임 네트워크 엔진 **프라우드넷**의 네트워크 모듈은 크게 두 개다.
```
┌──────────────────┐
│ ① ___ 클래스 │ 게임 서버 쪽
└────────┬─────────┘
│ 연결 / 메시지
┌────────┴─────────┐
│ ② ___ 클래스 │ 게임 클라이언트 쪽
└──────────────────┘
```
- ① `___` — **게임 서버의 메인 모듈**이다. 클라이언트의 연결을 받고 메시지를 주고받는다. 또한 각 클라이언트의 ③ `___` 상황을 열람할 수 있다.
- ② `___` — **게임 클라이언트의 네트워크 모듈**이다. 서버로 연결을 맺고 메시지를 주고받는다. 여기에 더해, 서버를 거치지 않고 **다른 클라이언트와 직접** 통신하는 것도 가능한데 이런 방식을 ④ `___` 통신이라 부른다.
> **출처:** `server/game_server/6/2026-02-18-game_server_6_2.md`
**📝 내 답:** (빈칸 수에 맞게 작성하세요)
---
## Q5. 🔴 어려움
프라우드넷에서 메시지를 주고받는 방법은 두 가지다 — **전통적인 방식으로 바이너리 데이터를 주고받기**, 그리고 **다른 컴퓨터에 있는 함수를 원격 호출하기**. 이 문제는 앞의 것을 다룬다.
`NetClient`와 `NetServer`에는 `SendUserMessage()` 함수가 있다.
```cpp
unsigned char data[100];
// 클라이언트 → 서버
c->SendUserMessage(HostID_Server, RmiContext::ReliableSend, data, 100);
// 서버 → 특정 클라이언트
s->SendUserMessage(ClientHostID, RmiContext::UnreliableSend, data, 50);
// 서버 → 여러 클라이언트
HostID sendTo[10];
s->SendUserMessage(sendTo, 10, RmiContext::UnreliableSend, data, 30);
```
받는 쪽은 이벤트 함수로 처리한다.
```cpp
c->OnReceiveUserMessage =
[...](HostID sender, const RmiContext& rmiContext,
uint8_t* payload, int payloadLength) {
... // 수신 이벤트 처리
};
```
(1) `SendUserMessage()`에 넘기는 인자는 크게 **세 종류**다. 각각이 무엇을 정하는지 쓰시오.
(2) `ReliableSend` / `UnreliableSend` 같은 전송 옵션들을 통틀어 담는 **구조체의 이름**은 무엇인가? 그리고 이 구조체에 담기는 옵션을 위 둘 말고 **두 가지 더** 쓰시오.
(3) 아래 두 데이터를 보낼 때 `ReliableSend`와 `UnreliableSend` 중 무엇을 고르겠는가? **각각의 이유**와 함께 답하시오.
- ㉠ 플레이어가 상점에서 아이템을 구매했다는 사실
- ㉡ 매 틱 갱신되는 다른 플레이어들의 캐릭터 위치
(4) 수신 콜백의 매개변수 **네 개**는 각각 무엇을 뜻하는가?
> **출처:** `server/game_server/6/2026-02-23-game_server_6_4.md`
**📝 내 풀이:**
<풀이를 여기에="" 작성하세요="">
---
풀이를>풀이를>
MallangQuiz 카테고리 내 다른 글 보러가기
댓글남기기