[말랑 퀴즈] 26/03/19 해답
카테고리: MallangQuiz
태그: Quiz
제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.
말랑말랑 퀴즈 — 해답지 ✅
날짜: 2026-03-19 문제 수: 5문제
Q1. 🟡 보통
문제: 다음 중 C++의 public 상속에 관한 설명으로 올바른 것은?
- A.
Square가Rectangle을 public 상속하면,Rectangle의 모든 동작이Square에도 그대로 적용 가능하다. - B. 펭귄(
Penguin)이 새(Bird)를 public 상속할 때,fly()함수를 오버라이드해서 런타임 에러를 던지는 것이 올바른 설계다. - C.
Student가Person을 public 상속하면,Person을 인자로 받는 함수에Student객체를 전달할 수 있다. - D. 수학적으로 is-a 관계가 성립하면 C++ public 상속으로 표현하는 것이 항상 옳다.
정답: C
해설:
- C (정답): public 상속은 is-a 관계를 의미하므로, 파생 클래스(
Student) 객체는 기본 클래스(Person)가 필요한 모든 곳에 전달될 수 있다. - A (오답):
Square가Rectangle을 상속해도, 가로만 변경하는makeBigger같은 함수는 정사각형의 “가로==세로” 불변식을 깨뜨린다. 기본 클래스의 모든 동작이 파생 클래스에 그대로 적용된다는 보장이 없다. - B (오답): 런타임 에러로 처리하는 방식은 나쁜 설계다. 유효하지 않은 동작은 컴파일 타임에 막는 것이 올바른 설계다.
- D (오답): 수학적 is-a 관계가 프로그래밍에서 항상 성립하지는 않는다.
Square-Rectangle예시처럼 수학적으로는 맞지만 소프트웨어 행동 측면에서 맞지 않는 경우가 있다.
출처:
game_dev/cpp/chapter6/2025-10-18-cpp_6_32.md
Q2. 🟢 쉬움
문제: 빈칸을 채우시오.
아래 코드는 AtomicExchange를 사용한다. 연산이 완료된 후 변수 r과 a의 값을 각각 빈칸에 채우시오.
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) 포인터를 반환하면 두 가지 실수가 발생할 수 있다.
- 사용자가 포인터 삭제(
delete)를 잊어버려 메모리 누수가 생긴다. - 동일한 포인터에
delete를 두 번 이상 호출해 미정의 동작이 발생할 수 있다.
[shared_ptr 반환 시 이점]
- 자동 메모리 관리: 반환된
shared_ptr은 참조 카운트를 기반으로 객체의 수명을 자동 관리한다. 사용자가 직접delete를 호출하지 않아도 되므로 누수와 이중 해제를 방지한다. - 사용자 정의 삭제자 지정 가능:
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
댓글남기기