[말랑 퀴즈] 26/11/13 문제

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

날짜: 2026-11-03 문제 수: 6문제


Q1. 🟢 쉬움

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

복사를 막고 싶은 클래스에서 복사 생성자와 복사 대입 연산자를 private로 선언만 하고 구현하지 않으면, 객체를 복사하려는 시도는 링크 시점에 에러가 난다. Uncopyable처럼 복사를 막아 둔 클래스를 상속하면, 이 에러가 링크 시점보다 더 늦은 실행 시점의 에러로 옮겨진다.

출처: game_dev/cpp/chapter2/2025-04-23-cpp_2_6.md

📝 내 답: O. Uncopyable을 상속하게 되면 에러가 복사를 시도했을 시 컴파일 시점에 발생한다.


Q2. 🟡 보통

윈도우의 IOCP와 리눅스의 epoll을 비교한 설명으로 가장 올바른 것은?

  • A. IOCP는 소켓 하나에 대한 완료 신호를 스레드 하나만 처리하게 보장할 수 있어서, IOCP 하나를 여러 스레드가 기다리게 구현하기 쉽다.
  • B. epoll은 Overlapped I/O를 이용해 블로킹을 없앤다.
  • C. IOCP는 리눅스와 안드로이드에서, epoll은 윈도우에서 사용하는 기술이다.
  • D. IOCP는 I/O 입력이 가능해졌을 때 알려 주는 준비 완료 기반이고, epoll은 I/O가 완료되었을 때 알려 주는 완료 기반이다.

출처: server/game_server/3/2026-02-07-game_server_3_9.md

📝 내 선택: A

B: overlapped I/O는 윈도우에서 사용하는 방식이며, epoll에서는 논블록 소켓을 이용한다. C: 반대다. D: 반대다.


Q3. 🟢 쉬움

빈칸을 채우시오.

블로킹 소켓에 대한 설명이다.

  • 블로킹이란 디바이스에 처리 요청을 걸고 응답을 대기하는 함수를 호출할 때 스레드에서 발생하는 ① ___ 현상이다. (두 글자)
  • 블로킹된 스레드는 ② ___ state 상태가 된다. (영문 소문자 한 단어)
  • 이때 그 스레드의 CPU 사용량은 ③ ___%가 된다. (숫자)
  • 스레드에서 네트워크 수신 함수를 호출했는데 상대 컴퓨터가 데이터를 보내지 않으면 ④ ___ 블로킹이 발생한다. (세 글자 부사)

출처: server/game_server/3/2025-12-16-game_server_3_1.md

📝 내 답: 대기, idle, 0, 무한정


Q4. 🟡 보통

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

Rational의 생성자 Rational(int numerator = 0, int denominator = 1)이 explicit가 아니라서 int가 Rational로 암시적 변환된다고 하자. operator*를 멤버 함수로 선언하면 oneHalf * 2는 컴파일되지만 2 * oneHalf는 컴파일되지 않는다. 2 * oneHalf도 되게 하려고 operator*를 비멤버 함수로 만들 때, 이 함수는 Rational의 public 인터페이스만으로 구현할 수 있더라도 friend로 선언하는 것이 바람직하다.

출처: game_dev/cpp/chapter4/2025-06-25-cpp_4_24.md

📝 내 답: X. friend를 피할수 있다면 피하는 것이 좋다.


Q5. 🟡 보통

아래 코드에서 w.setName(n);을 실행한 직후의 상황으로 가장 올바른 것은?

class Widget {
public:
	template<typename T>
	void setName(T&& newName)          // 보편 참조
	{ name = std::move(newName); }
private:
	std::string name;
};

std::string getWidgetName();            // 팩터리 함수
Widget w;
auto n = getWidgetName();               // n은 지역 변수 (lvalue)

w.setName(n);
  • A. n의 내용이 w.name으로 이동해 버려서, n의 값은 알 수 없는 상태가 된다.
  • B. n은 lvalue이므로 std::move가 무시되어, n의 값이 그대로 유지된 채 w.name으로 복사된다.
  • C. std::move를 보편 참조에 적용했으므로 컴파일 오류가 난다.
  • D. n의 값은 그대로 유지되고, w.name은 비어 있는 상태가 된다.

출처: game_dev/moderncpp/5/2026-09-16-moderncpp_5_25.md

📝 내 선택: A

B: n은 lvalue이지만 move를 적용할때 rvalue로 캐스팅되어, 값이 이전될수 있다. C: 컴파일 오류가 나지는 않는다. D: 둘다 비어있게 될수 있다.


Q6. 🔴 어려움 · 📌 오답노트 (2번째 복습)

C++에서 함수에 객체를 전달하는 방식에 대해 답하시오. 아래 클래스를 사용한다.

class Monster {
public:
	Monster();
	virtual ~Monster();
	virtual void attack() const;
private:
	string name;
	string type;
};

class Boss : public Monster {
public:
	Boss();
	~Boss();
	virtual void attack() const;
private:
	string skill;
	string loot;
};

bool check_Val(Boss b);
bool check_Ref(const Boss& b);

void act_Val(Monster m) { m.attack(); }
void act_Ref(const Monster& m) { m.attack(); }

(1) Boss boss; 다음에 check_Val(boss);를 호출하면 복사 생성자가 총 몇 번 호출되는가? 어떤 객체들의 복사 생성자인지 모두 쓰시오. 함수가 끝날 때의 소멸자 호출 횟수는 몇 번인가?

(2) check_Ref(boss);를 호출하면 복사 생성자는 호출되는가? 이때 const는 어떤 역할을 하는가?

(3) act_Val(boss);와 act_Ref(boss);를 호출했을 때, 각각 어느 클래스의 attack()이 실행되는가? 그 이유를 쓰고, act_Val에서 일어나는 현상의 이름을 쓰시오.

(4) 위 설명에도 불구하고 값 전달이 오히려 나은 타입 세 가지를 쓰시오.

출처: game_dev/cpp/chapter4/2025-06-18-cpp_4_20.md 오답노트: wn-7f70f538 · 2026-09-18 최초 오답 · 이번이 2번째 복습

📝 내 풀이: (1) 6번이며, Boss, skill, loot, Monster, name, type.
소멸자 호출 횟수는 6번

(2) const로 인해 호출되지 않는다. 상수 객체임을 보장한다.

(3) act_Val은 Monster의 attack, act_Ref는 Boss의 attack. 참조나 포인터로 Boss 객체를 가지고 있으면, 가상 함수 포인터와 가상 함수 테이블로 인해, 오버라이드된다.
가상 함수 오버라이드

(4) int같은 기본 자료형인 경우, 해당 함수 내부에서만 사용되는 경우, 원본의 값이 변경되면 안되는 경우


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

댓글남기기