[말랑 퀴즈] 26/10/16 문제

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

날짜: 2026-10-16 문제 수: 6문제


Q1. 🔴 어려움

C++ 템플릿 메타프로그래밍(TMP)에 대해 답하시오.

template<unsigned n>
struct Factorial {
	enum { value = n * Factorial<n-1>::value };
};

template<>
struct Factorial<0> {
	enum { value = 1 };
};

int main() {
	cout << Factorial<5>::value;   // 120
}

(1) 템플릿 메타프로그래밍이란 무엇이며, 기존 작업을 런타임에서 컴파일 타임으로 옮기면 얻는 이점 두 가지를 쓰시오.

(2) 위 Factorial에서 TMP에는 반복문(루프)이 없는데 어떻게 반복 효과를 내는가? 그리고 Factorial<0> 특수화가 하는 역할은 무엇인가?

(3) 반복자 종류를 typeid와 일반 if문으로 비교해 분기하는 advance보다, 특성정보를 이용한 오버로딩 방식이 더 나은 이유를 “컴파일”과 “런타임”이라는 표현을 써서 설명하시오.

(4) TMP의 실용적 활용 사례를 두 가지 이상 쓰시오.

출처: game_dev/cpp/chapter7/2025-11-03-cpp_7_48.md

📝 내 풀이: (1) 템플릿 메타프로그래밍이란 템플릿을 통해 객체를 템플릿 인스턴스로 만드는 것이다.

  1. 에러가 컴파일 타임에 발생하여 빠르게 점검할 수 있다. 2. 런타임 시점의 작업을 컴파일 시점으로 옮겨, 실행 속도가 빨라진다.

(2) 재귀식 템플릿 인스턴스화를 사용하여 반복 효과를 낸다. Factorial<0> 특수화는 종료 시점을 보장해준다.

(3) 타입 점검 동작이 컴파일이 아닌 런타임 시점에 발생하여 성능과 안정성이 떨어진다.

(4) 이건 잘몰라서 직접 봤다. 선행 에러 탐지, 행렬 연산 최적화, 맞춤식 디자인 패턴 중 하나인 정책 기반 설계를 구현할 수 있다.


Q2. 🟢 쉬움

UML 다이어그램에 대한 설명으로 가장 올바른 것은?

  • A. 시퀀스 다이어그램에서 객체는 타원으로, 메시지는 네모 상자로 표현한다.
  • B. 액티비티 다이어그램에서는 활동 상태를 타원으로 표현하며, “해커”와 “실제 사용자”처럼 조건에 따라 흐름을 나누는 조건 분기도 쓸 수 있다.
  • C. 시퀀스 다이어그램은 주고받은 메시지의 처리 방식을 자세히 표현하는 데 가장 적합하다.
  • D. 액티비티 다이어그램은 시간 순서에 따른 객체 간 메시지 전달을 표현하는 것이 가장 큰 목적이다.

출처: server/game_server/5/2026-02-12-game_server_5_1.md

📝 내 선택: B.

A: 해당 설명은 액티비티 다이어그램에 대한 것이다.
C: 액티비티 다이어그램에 대한 것이다.
D: 시퀀스 다이어그램에 대한 것이다.


Q3. 🟡 보통

빈칸을 채우시오.

C++이 클래스에 대해 암시적으로 생성하는 멤버 함수에 대한 설명이다.

  • 개발자가 선언하지 않으면 컴파일러가 대신 만들어 주는 멤버 함수는 기본 생성자, 소멸자, 복사 생성자, 그리고 ① ___이다. (함수 이름)
  • 클래스에 생성자가 하나라도 선언되어 있으면, 컴파일러는 ② ___를 생성하지 않는다. (함수 이름)
  • 컴파일러가 생성한 소멸자는, 이 클래스가 상속한 기본 클래스의 소멸자가 가상(virtual)이 아니면 ③ ___ 소멸자가 된다. (두 글자 수식어)
  • 컴파일러가 생성한 복사 생성자는 int 같은 기본 제공 타입 멤버에 대해서는 각 ④ ___을(를) 그대로 복사한다. (한 단어)

출처: game_dev/cpp/chapter2/2025-04-22-cpp_2_5.md

📝 내 답: 복사 대입 연산자, 기본 생성자, 비가상, 자원


Q4. 🟡 보통

다음 코드는 std::async를 기본 시동 방침으로 호출한 뒤 wait_for로 완료를 기다린다. 이에 대한 설명으로 가장 올바른 것은?

void f() { std::this_thread::sleep_for(1s); }

auto fut = std::async(f);              // 시동 방침을 명시하지 않음

while (fut.wait_for(100ms) != std::future_status::ready) {
	…
}
  • A. 기본 시동 방침은 std::launch::async와 같으므로, f는 항상 다른 스레드에서 실행된다.
  • B. 기본 시동 방침에서 f가 지연(deferred)되면 wait_for가 항상 std::future_status::deferred를 돌려주므로, 이 루프는 종료되지 않을 수 있다.
  • C. std::launch::deferred로 시동된 f는 get이나 wait를 한 번도 호출하지 않아도 결국 실행된다.
  • D. f가 thread_local 변수를 사용하더라도, 어느 스레드에서 실행되든 접근하는 변수는 항상 같으므로 신경 쓸 필요가 없다.

출처: game_dev/moderncpp/7/2026-10-07-moderncpp_7_36.md

📝 내 선택: B.

A: 기본 시동 방침은 맞다. f는 항상 다른 스레드에서 실행되진 않는다.
C: get를 호출해주어야 실행된다.
D: thread_local 변수는 해당 스레드에서만 사용되었던 것 같다.


Q5. 🟢 쉬움

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

C++11에서도 비const 컨테이너 values에서 const_iterator를 얻으려면 C++98처럼 static_cast<const_iterator>(values.begin())처럼 캐스팅하는 방법밖에 없다. cbegin()과 cend()는 비const 컨테이너에 대해서는 iterator를 돌려주기 때문이다.

출처: game_dev/moderncpp/3/2026-05-02-moderncpp_3_13.md

📝 내 답: X. C++11부터는 vlaues.cbegin()을 사용할 수 있으며, const_iterator를 돌려준다.


Q6. 🟡 보통 · 📌 오답노트 (3번째 복습)

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

하나의 스위치가 연결할 수 있는 단말기 수에는 한계가 있고, 단말기가 많아질수록 고유한 MAC 주소를 관리하기도 어려워진다. 이 문제를 해결하기 위해 3계층의 라우터는 MAC 주소를 기준으로 여러 LAN 사이에서 프레임을 전달한다.

출처: server/game_server/2/2025-06-30-game_server_2_1.md 오답노트: wn-34e57a32 · 2026-09-09 최초 오답 · 이번이 3번째 복습

📝 내 답: X. 첫 문장까지는 맞다. 두번째 문장에서 잘못되었는데, 3계층의 라우터는 MAC 주소를 기준으로 하는게 아니라, IP 주소를 기준으로 전달한다.


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

댓글남기기