[말랑 퀴즈] 26/10/16 문제
카테고리: MallangQuiz
태그: Quiz
제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.
말랑말랑 퀴즈 📝
날짜: 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) 템플릿 메타프로그래밍이란 템플릿을 통해 객체를 템플릿 인스턴스로 만드는 것이다.
- 에러가 컴파일 타임에 발생하여 빠르게 점검할 수 있다. 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 주소를 기준으로 전달한다.
댓글남기기