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

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

날짜: 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


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

댓글남기기