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

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

날짜: 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) autohighPriority를 어떤 형식으로 추론하는가? 그리고 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 카테고리 내 다른 글 보러가기

댓글남기기