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

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

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


Q1. 🟢 쉬움

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

게임 서버와 클라이언트가 주고받는 메시지에 “Action: BuyItem”, “Type: Sword”처럼 메타데이터를 붙이면 데이터 통신량이 늘고 해킹에 취약해진다는 단점이 있고, 서버와 클라이언트의 버전이 서로 다를 때의 하위 호환성 측면에서도 불리해진다.

출처: server/game_server/2/2025-12-09-game_server_2_8.md

📝 내 답: O. 이를 해결하기 위해 암호화해서 전송했던것같다.


Q2. 🟡 보통

데이터베이스 샤드를 10개에서 11개로 늘리면 샤드 키를 해시한 값으로 샤드를 정하던 기존 방식에서는 리해시(기존 레코드의 재배치)가 발생한다. 이 문제를 피하기 위해 입력(키) → 샤드 인덱스 정보를 가진 DB를 따로 두는 매핑 DB 방식에 대한 설명으로 가장 올바른 것은?

  • A. 샤드를 추가할 때 기존 레코드를 이동하지 않고, 새 샤드를 채우기만 하면 된다.
  • B. 매핑 DB는 모든 요청이 거치는 곳이지만, 과부하가 걸리더라도 단일 실패 지점(SPOF)이 되지는 않는다.
  • C. 샤드를 제거할 때도 매핑 DB와 유저 DB 모두 아무 변경이 필요 없다.
  • D. 인증 서버는 ID를 해시 함수에 넣어 직접 샤드 인덱스를 계산하므로, 매핑 DB에는 질의하지 않는다.

출처: server/game_server/9/2026-03-26-game_server_10_2.md

📝 내 선택: A.

B: SPOF가 되기에 문제가 생겼으며, 이런 경우 매핑DB도 분산하였다.
C: 샤드를 제거할때 매핑DB에서도 연관된 페어를 제거하고, 유저 DB도 업데이트해주어야한다.
D: 인증서버 - 매핑DB - 샤드를 거친다


Q3. 🟡 보통

빈칸을 채우시오.

프라우드넷의 RMI(원격 메소드 호출)에 대한 설명이다.

  • RMI를 호출하는 쪽에서 함수 호출을 대신 해 주는 송신 측 코드(클래스)를 ① ___(이)라고 한다. (영문 이름)
  • RMI를 호출받는 쪽에서 메시지를 받아 해당 함수를 호출해 주는 수신 측 코드(클래스)를 ② ___(이)라고 한다. (영문 이름)
  • RMI 함수는 확장자가 ③ ___인 파일에서 선언하며, 이 파일을 컴파일하면 송수신 코드 클래스가 자동 생성된다. (영문 대문자 네 글자)
  • 수신 측 코드를 상속해 클래스를 만드는 대신, 함수나 람다식을 직접 넣어서 쓸 수 있도록 제공되는 클래스는 CalcC2S:: 뒤에 ④ ___를 붙여 쓴다. (영문 클래스 이름, ②로 시작함)

출처: server/game_server/6/2026-02-25-game_server_6_6.md

📝 내 답: RMIServer, RMIClient, ?, RMIClient_Impl(모름)


Q4. 🔴 어려움

C++ RAII 클래스가 관리하는 자원을 외부에 노출하는 방법에 대해 답하시오.

shared_ptr<Investment> pInv(createInvestment());
int daysHeld(const Investment *pi);

int days = daysHeld(pInv);   // 컴파일 에러

(1) 위 코드가 컴파일 에러가 나는 이유를 쓰시오. 그리고 올바르게 호출하려면 어떻게 써야 하며, 이처럼 호출하는 방식의 변환을 무엇이라 하는가?

class Font {
public:
	explicit Font(FontHandle fh) : f(fh) {}
	~Font() { releaseFont(f); }

	FontHandle get() const { return f; }
	operator FontHandle() const { return f; }

private:
	FontHandle f;
};

void changeFontSize(FontHandle f, int newSize);

(2) Font f(getFont());가 있을 때 changeFontSize(f, 12);처럼 Font 객체를 그대로 넘겨도 컴파일되는 이유는 무엇이며, 이런 방식의 변환을 무엇이라 하는가?

(3) Font f1(getFont()); 다음에 FontHandle f2 = f1;이라고 쓰면, 어떤 일이 일어나고 어떤 문제가 생기는가? (f1이 소멸된 이후를 포함해서 쓰시오.)

(4) 명시적 변환과 암시적 변환 중, 안정성 측면에서 유리한 쪽과 고객 편의성 측면에서 유리한 쪽은 각각 무엇인가? 또 어떤 성격의 자원일 때 암시적 변환을 피하는 것이 좋은가?

출처: game_dev/cpp/chapter3/2025-06-11-cpp_3_15.md

📝 내 풀이: (1) shared_ptr을 포인터에 집어넣은 것, pInv.get(), 명시적 변환
(2) operator FontHandle()로 인해 FontHandle로의 암시적 변환 때문. 암시적 변환
(3) f2에 f1의 fonthandle이 복사된다. f1이 먼저 소멸되는 경우, f2가 이미 소멸된 값을 가진다.
(4) 안전성은 명시적, 편의성은 암시적이다. 서로 어떤 객체가 먼저 소멸될지 모르는 경우?


Q5. 🟢 쉬움

게임 서버 구조의 발전 과정에서 데디케이티드 서버에 대한 설명으로 가장 올바른 것은?

  • A. 렌더링과 사용자 입력 처리를 하지 않고 순전히 클라이언트의 연결을 처리하며, 게임 플레이에는 참여하지 않는 프로그램이다.
  • B. 플레이어 중 한 명이 호스트가 되어 서버 역할까지 겸하는 방식이다.
  • C. 호스트 플레이어가 게임 중간에 이탈하면 게임 진행에 문제가 생긴다는 단점이 있다.
  • D. 서버 기능과 함께 렌더링도 수행하므로, 호스트 플레이어에게 유리해질 수 있다.

출처: server/game_server/4/2026-02-08-game_server_4_1.md

📝 내 선택: A.

B: 해당 방식은 리슨 서버다.
C: 호스트는 게임 플레이에 참가하지 않기에 문제가 생기지 않는다.
D: 해당 방식은 리슨 서버다.


Q6. 🟡 보통 · 📌 오답노트 (2번째 복습)

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

클라이언트 ― 방화벽 ― 스위치/라우터 ― 서버 ― 데이터베이스로 이어진 단일 서버에서는, 라우터/스위치·방화벽·CPU·스토리지 중 하나라도 한계를 넘어서면 분산 처리가 필요하다. 이때 먼저 성능 분석으로 과부하 지점을 찾고, 더 자세한 성능 분석으로 어떤 함수가 많은 처리량을 차지하는지 확인한 뒤, 분산을 먼저 진행하고 그다음에 코드 최적화를 진행한다. 분산 단위는 데이터 단위와 기능 단위로 나뉜다.

출처: server/game_server/9/2026-03-18-game_server_9_4.md 오답노트: wn-11a5330b · 2026-09-15 최초 오답 · 이번이 2번째 복습

📝 내 답: X. 코드 최적화를 진행하고, 그래도 안되면 분산한다.


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

댓글남기기