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

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 — 해답지 ✅

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


Q1. 🟡 보통

문제: 빈칸을 채우시오.

C++에서 개발자가 선언하지 않아도 컴파일러가 자동으로 생성해주는 멤버 함수 4가지는 ___①___, ___②___, ___③___, ___④___이다. 이 함수들은 모두 public 멤버이며 ___⑤___ 함수로 생성된다.

단, 개발자가 이미 ___①___를 선언해두었다면 컴파일러는 ___①___를 생성하지 않는다.

정답:

① 기본 생성자 ② 소멸자 ③ 복사 생성자 ④ 복사 대입 연산자 ⑤ inline

해설:

컴파일러가 자동 생성하는 4가지 함수(기본 생성자, 소멸자, 복사 생성자, 복사 대입 연산자)는 모두 public + inline으로 만들어진다. 단, 개발자가 직접 생성자(어떤 형태든)를 선언해두면 컴파일러는 기본 생성자를 생성하지 않는다. 또한 클래스 멤버에 참조자나 const가 있으면 복사 대입 연산자는 자동 생성되지 않는다.

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


Q2. 🟢 쉬움

문제: 다음 게임 네트워크 엔진 중, 유니티/언리얼 엔진에 기본 내장되어 있는 것은?

  • A. 프라우드넷
  • B. 포톤 서버
  • C. 게임 스파크
  • D. 락넷

정답: D

해설:

락넷(RakNet)은 유니티/언리얼 엔진에 기본 내장된 네트워크 엔진이다. 프라우드넷은 클라이언트-서버 + P2P 직접 네트워킹을 지원하는 독립 엔진이고, 포톤 서버는 다양한 플랫폼을 지원하는 상용 엔진, 게임 스파크와 플레이팹은 서버 개발 없이 매치메이킹 등 기능을 제공하는 SaaS 형태다.

출처: server/game_server/6/2026-02-18-game_server_6_1.md


Q3. 🔴 어려움

문제: 아래 C++ 코드는 SQL 인젝션에 취약하다. 해커가 userName에 어떤 값을 넣어 어떻게 공격할 수 있는지 설명하고, 이를 방지하는 안전한 코드 방식을 작성하라.

sprintf(queryString, "select * from t1 where a='%s'", userName);
db.execute(queryString);

정답:

공격 방법:

해커가 userName에 아래와 같은 문자열을 넣는다:

'; delete from table1; select * from table1 where a='

그러면 queryString이 다음과 같이 변형된다:

select * from t1 where a=''; delete from table1; select * from table1 where a=''

원래 질의를 무효화하고 DELETE 등 임의의 SQL 구문을 실행시킬 수 있다.

방지 방법 — 매개변수화된 질의 구문:

DbCommand cmd = new DbCommand(db);
cmd.Parameters[0] = userName;
cmd.Execute("select * from table1 where a=?");

userName을 SQL 문자열에 직접 삽입하지 않고 파라미터로 분리하면, DB 드라이버가 값을 안전하게 이스케이프하여 SQL 구문으로 해석되지 않는다.

출처: server/game_server/7/2026-03-06-game_server_7_11.md


Q4. 🟡 보통

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

수신 버퍼가 가득 찼을 때, TCP와 UDP 모두 송신 측의 send() 함수가 블로킹된다.

정답: X

해설:

TCP는 흐름 제어(flow control)를 통해 수신 측 버퍼가 가득 차면 송신 측 send()가 블로킹된다. 반면 UDP는 흐름 제어가 없어 수신 버퍼가 꽉 찬 상태에서도 송신 측 send()는 계속 실행된다. 다만 수신 측에서 처리하지 못한 초과 데이터는 그냥 버려진다. 이처럼 UDP가 무분별하게 전송하면 네트워크 혼잡이 발생해 TCP 통신이 경쟁에서 밀리는 혼잡 현상이 나타난다.

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


Q5. 🔴 어려움

문제: 아래 코드에서 컴파일러가 warning: D::f() hides virtual B::f()를 출력했다. 이 경고의 의미로 올바른 것은?

class B {
public:
    virtual void f() const;
};

class D : public B {
public:
    virtual void f();
};
  • A. D::f()B::f()를 성공적으로 오버라이드했다.
  • B. D::f()B::f()를 가리고 있으며, 오버라이드가 아니다.
  • C. B::f()D::f()는 시그니처가 같아 다형성이 정상 적용된다.
  • D. D::f()const가 없어 컴파일이 실패한다.

정답: B

해설:

오버라이드가 되려면 두 함수의 시그니처가 완전히 같아야 한다. B::f()const 멤버 함수, D::f()는 비const 멤버 함수로 시그니처가 다르다. 따라서 오버라이드가 아니라 D::f()B::f()의 이름을 가리는 name hiding이 발생한다. B::f()D에서도 노출하려면 using B::f;를 추가해야 한다. 컴파일은 성공하지만 의도한 다형성이 동작하지 않으므로 반드시 경고를 확인해야 한다.

출처: game_dev/cpp/chapter9/2025-11-11-cpp_9_53.md


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

댓글남기기