[말랑 퀴즈] 26/09/18 문제
카테고리: MallangQuiz
태그: Quiz
제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.
말랑말랑 퀴즈 📝
날짜: 2026-09-18 문제 수: 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
📝 내 풀이:
(1) 복사2번: Person -> Student
생성자 소멸자 2번: Student -> Person
(2) 추가적인 호출 필요가 없어진다.
일관성. 내부 값이 변하지 않는다.
(3) 자식의 display를 부른다. 함수 오버라이딩으로 인한 것이다.
ref 버전이라면 부모의 display를 호출한다.
(4) 값으로 전달하면 좋은 타입은 모르겠다.
기억나지 않는다.
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
📝 내 선택: 2. C.
A: 설명이 반대이다.
B: 서버 한대당 유지비용이 온프레미스보다 낮다는것 빼곤 다 반대이다.
D: Paas에 대한 설명은 맞을것같다. 하지만 IaaS에 대한 설명은 틀렸다. 이는 SaaS에 대한 내용이다.
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번째 복습
📝 내 풀이:
(1) ㄱ: 논리적 상수성
ㄴ: 반환값이 참조이므로, 외부에서 수정이 가능해진다.
ㄷ: 비트단위 상수성. 완전히 상수성을 보장하는 것이 아니라, 필요한 부분만 상수성을 보장하면 된다.
(2) mutable. textLength, lengthIsValid이며 pText는 읽기만 한다.
(3) 1은 되고 2는 안된다. 2번은 상수 객체이며 상수 반환값이기 때문
(4) ㄱ: const_cast, static_cast
ㄴ: 정확히 기억 안난다.
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
📝 내 선택: 5. B.
A: 운영체제마다 소켓 API가 다르기때문에 네트워크 엔진이 필요한 것이다.
C: 표에 보이는 것처럼 Cpp도 지원한다.
D: 락넷은 SaaS가 아니다. 정확히 무슨 형태인지는 기억나지 않지만 언리얼에서 사용하는 것으로 알고있다.
Q6. 🟢 쉬움
다음 명제가 참(O)인지 거짓(X)인지 판단하라.
C++은 하나의 언어라기보다 여러 하위 언어의 연합체로 보는 것이 정확하다. 그 하위 언어는 세 가지 — C, 객체 지향 개념의 C++, 그리고 STL — 이며, 템플릿은 STL을 구현하는 수단이므로 별도의 하위 언어로 치지 않고 STL에 포함시켜 본다.
출처:
game_dev/cpp/chapter1/2025-01-02-cpp_1_1.md
📝 내 답: O. C++은 하나의 언어가 아니다. 그 예시로 C++를 C처럼 쓸수도 있다. vector
댓글남기기