[말랑 퀴즈] 26/08/20 문제

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

날짜: 2026-08-20 문제 수: 5문제


Q1. 🟡 보통

다음 C++ 코드는 마지막 줄에서 컴파일이 거부된다. (stringstd::string이다.)

template <class T>
class NamedObject {
public:
    NamedObject(string& name, const T& value);
    // 복사 생성자와 복사 대입 연산자는 선언하지 않았다

private:
    string& nameValue;    // 참조자
    const T objectValue;  // 상수
};

string newDog("Persephone");
string oldDog("Satch");

NamedObject<int> p(newDog, 2);
NamedObject<int> s(oldDog, 36);

p = s;   // ← 컴파일 에러

(1) 컴파일러가 이 클래스의 복사 대입 연산자를 암시적으로 만들어주지 못하는 이유를, nameValueobjectValue 각각에 대해 설명하시오.

nameValue는 string형을 참조하기에 괜찮다. objectValue는 템플릿 클래스이므로, 컴파일러는 해당 클래스에 대해 정보가 없기에 문제가 발생한다.

(2) 이 에러를 해결하려면 어떻게 해야 하는가?

템플릿 특수화를 사용한다

(3) 한편 이 클래스에 대해 컴파일러는 기본 생성자도 만들어주지 않는다. 그 이유는 무엇인가?

컴파일 시점에서 T에 대해 알고 있는 정보가 없기에 발생한다.

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

📝 내 풀이:

<풀이를 여기에="" 작성하세요=""> --- ## Q2. 🔴 어려움 UE5의 GAS(Gameplay Ability System)로 스킬 쿨다운을 구현하고, 남은 시간을 HUD에 숫자로 표시했다. 쿨다운 GE(GameplayEffect)는 `CommitAbility` 안에서 적용되므로 **예측 대상**이라, 클라이언트에는 자기가 만든 예측본이 먼저 생기고 서버가 만든 것이 나중에 복제로 도착한다. 쿨다운 5.0초, RTT 0.5초인 상황에서 표시값이 이렇게 움직인다. ``` t=0.0 스킬 사용 표시 5.0 t=0.5 (예측본 기준 4.5초 남음) 표시 4.5 t=0.5 서버본 도착 표시 5.0 ← 되돌아감 그 이후는 정상적으로 감소 ``` 되돌아가는 값이 4.7도 4.9도 아니고 **매번 정확히 처음 값(5.0)** 이다. 이 현상의 원인으로 **가장 올바른 것**은? - A. 쿨다운 GE는 예측 대상이 아니어서 클라이언트에는 GE가 생기지 않고, 서버본이 도착하는 순간 처음으로 생성되기 때문이다. - B. 클라이언트가 아는 서버 시각이 다운링크 지연만큼 뒤처져 있어서, 서버본이 도착한 시점에 계산된 경과 시간이 0이 되어 "방금 시작한 것"으로 취급되기 때문이다. - C. 위젯이 예측본과 서버본 중 항상 큰 값을 고르기 때문이며, 작은 쪽을 고르도록 바꾸면 해결된다. - D. 예측 키가 catch-up되기 전까지 두 GE의 지속시간이 합산되어 계산되기 때문이다. > **출처:** `game_dev/devlog/2026-07-26-EP_GAS-6.md` **📝 내 선택:** B --- ## Q3. 🔴 어려움 다음 명제가 참(O)인지 거짓(X)인지 판단하라. > 타르코프식 정보 은닉을 위해 캐릭터의 `HP`에 `COND_OwnerOnly`를 걸어 적의 체력을 볼 수 없게 만들었다. 그러면 다른 클라이언트는 HP가 0이 되는 것을 볼 수 없어 사망 사실도 알 수 없으므로, 아래처럼 사망을 별도로 통보한다. > > ```cpp > UFUNCTION(NetMulticast, Reliable) > void Multicast_Die(); > ``` > > `Reliable`이므로 이 구조에서는 매치 도중 **나중에 접속한 클라이언트**도 이미 죽어 있는 캐릭터를 시체 상태로 올바르게 보게 된다. > **출처:** `game_dev/devlog/2026-03-01-EP_Replication-5.md` **📝 내 답:** X. Multicast는 나중에 접속한 클라이언트에게는 정보를 보내주지 않는다. 그러므로 서버는 따로 처리해준다. --- ## Q4. 🟢 쉬움 빈칸을 채우시오. 연역된 형식을 **실행 시점**에 확인하는 방법으로 `typeid(...).name()`이 있지만, 이 `std::type_info::name`은 믿을 만하지 않다. ```cpp template void f(const T& param) { cout << "param = " << typeid(param).name() << '\n'; } // 출력: param = class Widget const * // 실제로는 class Widget const * const & 이어야 한다 ``` `std::type_info::name`은 전달된 인자를 템플릿 함수에 ① `___` 매개변수로 전달된 것처럼 취급하기 때문에, ② `___` · `volatile` · ③ `___`를 무시해버린다. 반면 Boost의 `type_id_with_cvr`은 이 셋을 모두 보존해서 출력한다. > **출처:** `game_dev/moderncpp/1/2026-04-06-moderncpp_1_4.md` **📝 내 답:** ?, const, reference --- ## Q5. 🟡 보통 플레이어 간 상호작용이 없는 게임에서 유저 DB가 과부하라, 플레이어 정보를 여러 DB **샤드**에 나눠 저장하기로 했다. 인증 서버는 클라이언트가 보낸 ID를 해시 함수에 넣어 샤드 인덱스를 얻고, 그 샤드에 질의한다. (이때 쓰인 키 ID를 **샤드 키**라고 한다.) 그런데 서비스가 커져서 샤드를 **10개에서 11개로** 늘리려고 한다. (1) 이 증설이 왜 단순하지 않은지, 무슨 일이 벌어지고 그것이 운영상 어떤 문제가 되는지 설명하시오. (2) **일관된 해시 알고리즘**은 이 문제를 어떻게 완화하는가? 일반적인 해시 테이블과 무엇이 다른지를 포함해 설명하시오. (3) **매핑 DB**를 두는 방식은 어떤 이점이 있으며, 그 대신 어떤 위험을 떠안게 되는가? > **출처:** `server/game_server/9/2026-03-26-game_server_10_2.md` **📝 내 풀이:** 1. 해시 값을 재설정해주어야한다. 서버가 잠시 정지된다. 2. 미리 영역을 크게 잡아두고 배정시키는 것으로 기억난다. 자세히는 모르겠다. 3. 매핑 DB에 병목이 발생할 수 있다.

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

댓글남기기