[말랑 퀴즈] 26/03/19 해답

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 — 해답지 ✅

날짜: 2026-03-19 문제 수: 5문제


Q1. 🟡 보통

문제: 다음 중 C++의 public 상속에 관한 설명으로 올바른 것은?

  • A. SquareRectangle을 public 상속하면, Rectangle의 모든 동작이 Square에도 그대로 적용 가능하다.
  • B. 펭귄(Penguin)이 새(Bird)를 public 상속할 때, fly() 함수를 오버라이드해서 런타임 에러를 던지는 것이 올바른 설계다.
  • C. StudentPerson을 public 상속하면, Person을 인자로 받는 함수에 Student 객체를 전달할 수 있다.
  • D. 수학적으로 is-a 관계가 성립하면 C++ public 상속으로 표현하는 것이 항상 옳다.

정답: C

해설:

  • C (정답): public 상속은 is-a 관계를 의미하므로, 파생 클래스(Student) 객체는 기본 클래스(Person)가 필요한 모든 곳에 전달될 수 있다.
  • A (오답): SquareRectangle을 상속해도, 가로만 변경하는 makeBigger 같은 함수는 정사각형의 “가로==세로” 불변식을 깨뜨린다. 기본 클래스의 모든 동작이 파생 클래스에 그대로 적용된다는 보장이 없다.
  • B (오답): 런타임 에러로 처리하는 방식은 나쁜 설계다. 유효하지 않은 동작은 컴파일 타임에 막는 것이 올바른 설계다.
  • D (오답): 수학적 is-a 관계가 프로그래밍에서 항상 성립하지는 않는다. Square-Rectangle 예시처럼 수학적으로는 맞지만 소프트웨어 행동 측면에서 맞지 않는 경우가 있다.

출처: game_dev/cpp/chapter6/2025-10-18-cpp_6_32.md


Q2. 🟢 쉬움

문제: 빈칸을 채우시오.

아래 코드는 AtomicExchange를 사용한다. 연산이 완료된 후 변수 ra의 값을 각각 빈칸에 채우시오.

volatile int a = 3;
int r = AtomicExchange(&a, 10);
// 연산 후: r == ①___, a == ②___

정답:

① 3 ② 10

해설:

AtomicExchange(&a, 10)은 변수 a의 현재 값과 새 값 10원자적으로 교환한다. 교환 전 a의 값(3)이 반환값 r에 저장되고, a는 새 값인 10으로 교체된다. 이 연산은 원자적으로 수행되므로 중간에 다른 스레드가 끼어들 수 없다.

출처: server/game_server/1/2025-06-19-game_server_1_15.md


Q3. 🔴 어려움

문제: 아래 팩토리 함수 설계의 문제점을 설명하고, shared_ptr을 반환하도록 변경했을 때 얻을 수 있는 이점 두 가지를 서술하시오.

// 변경 전
Investment* createInvestment();

// 변경 후
shared_ptr<Investment> createInvestment();

정답:

[문제점]

날(raw) 포인터를 반환하면 두 가지 실수가 발생할 수 있다.

  1. 사용자가 포인터 삭제(delete)를 잊어버려 메모리 누수가 생긴다.
  2. 동일한 포인터에 delete두 번 이상 호출해 미정의 동작이 발생할 수 있다.

[shared_ptr 반환 시 이점]

  1. 자동 메모리 관리: 반환된 shared_ptr은 참조 카운트를 기반으로 객체의 수명을 자동 관리한다. 사용자가 직접 delete를 호출하지 않아도 되므로 누수와 이중 해제를 방지한다.
  2. 사용자 정의 삭제자 지정 가능: shared_ptr 생성 시 커스텀 삭제자를 지정할 수 있어, 단순 delete 외의 정리 작업(예: 파일 닫기, 잠금 해제, 교차 DLL 간 올바른 해제)을 안전하게 처리할 수 있다.

출처: game_dev/cpp/chapter4/2025-06-16-cpp_4_18.md


Q4. 🟢 쉬움

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

C++에서 복합 대입 연산자(+=, -= 등)는 일반 대입 연산자(=)와 달리, *this의 참조자를 반환하지 않아도 된다.

정답: X

해설:

복합 대입 연산자(+=, -=, *= 등)도 일반 대입 연산자(=)와 동일한 규약을 따라야 한다. 즉, 모두 *this의 참조자를 반환해야 한다. 이는 C++에서 a = b = c 또는 a += b += c 같은 연쇄 대입이 가능하도록 하기 위한 관례이며, 매개변수 타입이 무엇이든 상관없이 일관되게 적용된다.

Widget& operator+=(const Widget& rhs) {
    ...
    return *this; // 반드시 *this 참조자 반환
}

출처: game_dev/cpp/chapter2/2025-05-30-cpp_2_10.md


Q5. 🟡 보통

문제: 아래는 서버 측 TCP 소켓 프로그래밍의 일반적인 흐름이다. 각 함수의 동작 설명 중 틀린 것은?

s = socket(TCP);   // 1
s.bind(5959);      // 2
s.listen();        // 3
s2 = s.accept();   // 4
r = s2.recv();     // 5
  • A. bind(5959) — 5959번 포트를 점유 시도하며, 이미 사용 중이라면 실패한다.
  • B. listen() — 소켓을 리스닝 소켓으로 전환하며, 즉시 리턴된다(블로킹 아님).
  • C. accept() — 클라이언트가 접속하면 리스닝 소켓(s)과 동일한 포트를 사용하는 새 소켓을 반환한다.
  • D. recv() — 수신 버퍼에 데이터가 없으면 데이터가 들어올 때까지 블로킹된다.

정답: C

해설:

accept()는 클라이언트 연결이 성립되면 새로운 포트를 사용하는 소켓 핸들(s2)을 반환한다. 원래의 리스닝 소켓(s)은 5959번 포트에서 계속 다음 연결을 기다리고, 새로 생성된 소켓은 별도의 포트를 통해 해당 클라이언트와 1:1로 통신한다. 나머지 선택지(A, B, D)는 모두 올바른 설명이다.

출처: server/game_server/3/2026-02-03-game_server_3_4.md


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

댓글남기기