[말랑 퀴즈] 26/09/17 문제
카테고리: MallangQuiz
태그: Quiz
제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.
말랑말랑 퀴즈 📝
날짜: 2026-09-17 문제 수: 6문제
Q1. 🔴 어려움
C++은 따로 지정하지 않으면 함수에 객체를 값으로 전달(pass-by-value) 한다. 즉 매개변수는 실제 인자의 복사본으로 초기화된다.
class Person {
public:
Person();
virtual ~Person();
private:
std::string name;
std::string address;
};
class Student : public Person {
public:
Student();
~Student();
private:
std::string schoolName;
std::string schoolAddress;
};
bool validateStudent_Val(Student s); // 값으로 전달
bool validateStudent_Ref(const Student& s); // 상수 참조자로 전달
Student plato;
validateStudent_Val(plato);
validateStudent_Ref(plato);
(1) validateStudent_Val(plato)를 호출하면 복사 생성자가 몇 번, 무엇에 대해 호출되는가? 그리고 함수가 끝날 때 소멸자는 몇 번 호출되는가? 항목을 하나씩 나열하시오.
(2) validateStudent_Ref(plato)에서는 (1)의 비용이 어떻게 달라지는가? 그리고 참조자 앞에 붙은 const 가 추가로 보장해 주는 것은 무엇인가?
(3) 아래 코드에서 printNameAndDisplay_Val(wwsb)를 호출하면 w.display()는 어느 클래스의 display 를 부르는가? 그 이유를 쓰고, 이 현상의 이름을 쓰시오. _Ref 버전이라면 어떻게 달라지는가?
class Window {
public:
std::string name() const;
virtual void display() const;
};
class WindowWithScrollBars : public Window {
public:
virtual void display() const; // 재정의
};
void printNameAndDisplay_Val(Window w) { std::cout << w.name(); w.display(); }
void printNameAndDisplay_Ref(const Window& w) { std::cout << w.name(); w.display(); }
WindowWithScrollBars wwsb;
printNameAndDisplay_Val(wwsb);
printNameAndDisplay_Ref(wwsb);
(4) 그럼에도 값으로 전달하는 편이 나은 타입이 세 종류 있다. 무엇인가? 그리고 “double 하나만 멤버로 가진 작은 클래스”는 왜 그 셋에 들지 않는가? (원문이 드는 이유 두 가지)
출처:
game_dev/cpp/chapter4/2025-06-18-cpp_4_20.md
📝 내 풀이:
풀이를 여기에 작성하세요
Q2. 🟡 보통
게임 서버를 어디에 띄울지 정하는 문제다. 선택지는 크게 온프레미스(on-premise) 서버와 클라우드 서버이고, 클라우드 서비스는 IaaS / PaaS / SaaS 세 계층으로 나뉜다.
이에 대한 설명으로 가장 올바른 것은?
- A. 온프레미스 서버는 데이터센터에 직접 하드웨어를 설치하므로 자동 스케일 아웃이 가능하고, 클라우드 서버는 가상 머신이라 사용자 수가 갑자기 늘 때 대응하지 못한다.
- B. 클라우드 서버는 리얼 머신 안에 가상 머신을 여러 개 띄우는 구조라 리얼 머신보다 빠르고, 서버 한 대당 유지 비용도 온프레미스보다 낮다. 다만 처리 속도의 균일성이 높아 실시간 게임에 유리하다.
- C. 온프레미스는 서버 한 대당 유지 비용이 낮고 처리 속도가 균일하지만 증설·철거가 느려 유동적인 사용자 수에 빠르게 대응하지 못한다. 클라우드는 가상 머신이라 리얼 머신보다 느리고 유지 비용이 높지만 필요할 때 쉽게 늘리거나 줄일 수 있고 자동 스케일 아웃이 가능하다. 클라우드 계층은 IaaS → PaaS → SaaS로 갈수록 제어 수준과 관리 복잡도가 함께 낮아진다.
- D. PaaS는 가상 머신 자체를 제공하는 가장 낮은 계층으로, 운영체제부터 직접 관리해야 하므로 제어권이 최대다. IaaS는 운영체제와 프레임워크가 이미 돌아가고 있어 건드릴 수 없으며 웹 호스팅이 그 예다.
출처:
server/game_server/4/2026-02-11-game_server_4_8.md
📝 내 선택: ( )
Q3. 🔴 어려움 · 📌 오답노트 (2번째 복습)
const의 상수성에 대한 문제다.
(1) 아래 operator[]는 멤버 함수 뒤에 const가 붙어 있고, 실제로 함수 안에서 어떤 데이터 멤버도 수정하지 않는다. 그래서 컴파일러는 이 함수를 const로 인정한다.
class CTextBlock {
public:
char& operator[](size_t position) const { // const 멤버 함수
return pText[position]; // 멤버를 수정하지 않는다
}
private:
char* pText;
};
const CTextBlock cctb("Hello"); // 상수 객체
char* pc = &cctb[0];
*pc = 'J'; // ⚠️ 컴파일 통과 — 그런데 상수 객체의 내용이 바뀐다!
- ㉠ 컴파일러가 이 함수를
const로 인정하는 근거가 되는 상수성 개념의 이름은 무엇인가? - ㉡ 그 개념에 따르면
const인데도 왜 상수 객체의 내용이 바뀌는가? (반환값의 형태에 주목하시오) - ㉢ 이 허점을 보완하기 위해 나온 다른 상수성 개념은 무엇이며, 어떻게 정의되는가?
(2) 아래 코드는 문자열 길이를 캐싱하려는 의도다. 그런데 컴파일 에러가 난다.
class CTextBlock {
public:
size_t length() const;
private:
char* pText;
size_t textLength; // 캐시된 길이
bool lengthIsValid; // 캐시가 유효한가
};
size_t CTextBlock::length() const {
if (!lengthIsValid) {
textLength = strlen(pText); // ❌
lengthIsValid = true; // ❌
}
return textLength;
}
어떤 키워드를 어느 멤버에 붙여야 하는가? 그리고 세 멤버 중 붙이지 않아야 할 멤버는 무엇이며 왜인가?
(3) 아래는 const 유무만 다른 두 operator[]다.
class TextBlock {
public:
const char& operator[](size_t position) const { return text[position]; } // (a)
char& operator[](size_t position) { return text[position]; } // (b)
private:
std::string text;
};
TextBlock tb("Hello");
const TextBlock ctb("World");
tb[0] = 'x'; // ①
ctb[0] = 'x'; // ②
①과 ② 각각 되는지 안 되는지, 안 된다면 정확히 무엇 때문에 안 되는지 쓰시오. (호출되는 함수와 그 반환 타입을 근거로)
(4) (a)와 (b)의 본문이 같아 중복이다. (b)가 (a)를 호출하도록 만들어 중복을 없앨 수 있다.
char& operator[](size_t position) {
return ___________( // ③ 단계
___________(*this) // ① 단계
[position] // ② 단계
);
}
- ㉠ ①②③ 각 단계에서 무엇을 하는지, 빈칸에 들어갈 캐스트를 포함해 쓰시오.
- ㉡ 반대 방향 — (a)가 (b)를 호출하게 만드는 것은 왜 안 되는가?
출처:
game_dev/cpp/chapter1/2025-04-06-cpp_1_3.md오답노트:wn-628f38c5· 2026-09-10 최초 오답 · 이번이 2번째 복습
📝 내 풀이:
풀이를 여기에 작성하세요
Q4. 🟢 쉬움
빈칸을 채우시오.
분산 처리 전략의 요약이다.
- 첫 번째 원칙 — 분산 처리를 피할 수 있다면 ①
___. - 어디를 분산할지는 ②
___을(를) 통해 지점을 엄선한다. - 나누려는 데이터의 ③
___을(를) 확인하고 분산한다. 이것이 높은 데이터를 억지로 나누면 서버 간 통신이 폭증한다. - 분산 처리 방식은 세 가지다.
- ④
___분산 처리 — 다른 서버에 요청하고 응답을 기다린다 - ⑤
___분산 처리 — 다른 서버에 요청만 던지고 기다리지 않는다 - 데이터 ⑥
___기반 로컬 처리 — 필요한 데이터를 서버끼리 맞춰 두고 자기 메모리에서 판단한다
- ④
출처:
server/game_server/9/2026-03-22-game_server_9_10.md
📝 내 답: (빈칸 수에 맞게 작성하세요)
Q5. 🟡 보통
게임 서버를 만들 때 소켓 API를 직접 쓰지 않고 네트워크 엔진을 쓰는 경우가 많다. 아래는 주요 엔진들이다.
| 엔진 | 차별성 | 지원 언어 |
|---|---|---|
| 프라우드넷 | ? | C++, C# |
| 포톤 서버 | 다양한 플랫폼의 게임 클라이언트를 지원한다 | C# |
| 게임 스파크 | ? | C++, C#, Objective-C, 자바 |
| 플레이팹 | 게임 스파크와 유사하다 | C++, C#, Lua, Objective-C, 자바, 자바스크립트 |
| 락넷 | ? | C++, C# |
네트워크 엔진에 대한 설명으로 가장 올바른 것은?
- A. 네트워크 엔진이 필요한 이유는 운영체제마다 소켓 API가 완전히 동일해서 굳이 직접 다룰 필요가 없기 때문이다. 엔진은 그 동일한 API를 한 번 더 감싼 편의 계층일 뿐이다.
- B. 게임 스파크와 플레이팹은 로그인·매치메이킹·플레이어 정보 관리 같은 기능을 서버 개발 없이도 쓸 수 있게 하며, 특정 운영체제에 구애받지 않는 SaaS 형태다. 락넷은 유니티·언리얼 엔진에 기본 내장된 엔진이고, 프라우드넷은 클라이언트-서버 네트워킹과 클라이언트 간 직접 네트워킹을 단순하게 쓸 수 있게 하면서 암호화·압축·흐름 제어를 제공한다.
- C. 프라우드넷은 C# 하나만 지원하며, 그 대신 윈도·iOS·안드로이드·플레이스테이션·Xbox·WebGL 등 가장 다양한 클라이언트 플랫폼을 지원하는 것이 차별성이다.
- D. 락넷은 게임 스파크·플레이팹처럼 SaaS 형태로 제공되어 운영체제에 구애받지 않으므로, 유니티나 언리얼을 쓰지 않는 프로젝트에서 가장 먼저 검토할 엔진이다.
출처:
server/game_server/6/2026-02-18-game_server_6_1.md
📝 내 선택: ( )
Q6. 🟢 쉬움
다음 명제가 참(O)인지 거짓(X)인지 판단하라.
C++은 하나의 언어라기보다 여러 하위 언어의 연합체로 보는 것이 정확하다. 그 하위 언어는 세 가지 — C, 객체 지향 개념의 C++, 그리고 STL — 이며, 템플릿은 STL을 구현하는 수단이므로 별도의 하위 언어로 치지 않고 STL에 포함시켜 본다.
출처:
game_dev/cpp/chapter1/2025-01-02-cpp_1_1.md
📝 내 답: O / X
댓글남기기