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

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 — 해답지 ✅

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


Q1. 🟢 쉬움

문제: 다음 중 관계형 데이터베이스(RDBMS)와 NoSQL의 차이에 대한 설명으로 옳은 것은?

  • A. RDBMS는 레코드가 트리나 구조체 형태를 가질 수 있어 유연한 스키마 변경에 강하다
  • B. RDBMS에서 레코드가 1억 개인 테이블에 새 필드를 추가하면, null을 허용하더라도 장시간 시스템이 멈출 수 있다
  • C. NoSQL은 리스트·배열 구조만 지원하며, 중첩된 계층형 데이터를 표현할 수 없다
  • D. NoSQL은 RDBMS보다 항상 더 빠른 읽기 성능을 보장한다

정답: B

해설:

RDBMS에서 수억 건의 레코드에 새 필드를 추가하는 작업은 전체 테이블을 수정해야 하므로, null 허용 여부와 무관하게 장시간 시스템이 멈추는 문제가 발생할 수 있다. A는 설명이 뒤바뀌었다 — 트리·구조체 형태의 레코드를 지원하는 것은 NoSQL이고, RDBMS는 리스트·배열 구조이다. C도 반대로 설명하고 있으며, D는 상황에 따라 다르므로 절대적으로 성립하지 않는다.

출처: server/game_server/8/2026-03-08-game_server_8_1.md


Q2. 🟡 보통

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

아래처럼 clearCache(), clearHistory(), removeCookies()를 묶어 일괄 실행하는 기능은, 클래스의 데이터를 직접 다루는 동작이 없더라도 WebBrowser의 멤버 함수 clearEverything()으로 구현하는 것이 비멤버 함수보다 캡슐화 측면에서 더 바람직하다.

class WebBrowser {
public:
    void clearCache();
    void clearHistory();
    void removeCookies();

    void clearEverything(); // clearCache + clearHistory + removeCookies 호출
};

정답: X

해설:

캡슐화의 핵심은 데이터에 접근할 수 있는 경로를 줄이는 것이다. clearEverything()은 클래스의 private 데이터에 직접 접근하지 않고, 이미 공개된 세 함수를 조합할 뿐이다. 멤버 함수로 만들면 클래스 내부에 접근 경로(멤버 함수)가 불필요하게 늘어나 캡슐화가 오히려 약해진다. 반면, 비멤버 비프렌드 함수로 구현하면 클래스 외부의 독립적인 코드가 되어 내부 구현을 보호하면서 기능을 제공할 수 있으므로 캡슐화가 강화된다.

출처: game_dev/cpp/chapter4/2025-06-24-cpp_4_23.md


Q3. 🔴 어려움

문제: 아래 코드는 메뉴 배경을 교체하는 함수이다.

void PrettyMenu::changeBackground(std::istream& imgSrc) {
    lock(&mutex);

    delete bgImage;
    ++imageChanges;
    bgImage = new Image(imgSrc);

    unlock(&mutex);
}
  1. 이 코드에서 발생할 수 있는 예외 안전성 문제 2가지를 설명하시오.
  2. C++ 예외 안전성의 세 가지 보장 수준의 차이를 서술하시오.
  3. 복사 후 맞바꾸기(copy-and-swap) 패턴이 어떻게 강력한 보장을 달성하는지 설명하시오.

정답:

1. 예외 안전성 문제 2가지

  • 자원 누출: new Image(imgSrc)에서 예외가 발생하면 이후 unlock(&mutex)가 실행되지 않아 뮤텍스가 영원히 잠긴 채로 남는다.
  • 자원 오염: new Image(imgSrc)가 예외를 던지는 시점에 bgImage는 이미 delete로 삭제되고, imageChanges는 이미 증가한 상태이다. 즉, 배경 변경에 실패했음에도 프로그램 상태가 오염된다.

2. 세 가지 예외 안전성 보장 수준

수준 정의
기본적인 보장 (basic guarantee) 예외 발생 시 프로그램의 모든 것을 유효한 상태로 유지하지만, 정확히 어떤 상태인지는 예측할 수 없다.
강력한 보장 (strong guarantee) 예외 발생 시 프로그램 상태를 함수 호출 이전으로 완전히 되돌린다. 성공 아니면 원상 복구, 두 가지 상태만 존재한다.
예외불가 보장 (nothrow guarantee) 어떤 예외도 절대 던지지 않는다. 가장 강력하지만 현실적으로 구현이 어렵다.

3. 복사 후 맞바꾸기(copy-and-swap) 적용

struct PMImpl {
    shared_ptr<Image> bgImage;
    int imageChanges;
};

class PrettyMenu {
    Mutex mutex;
    shared_ptr<PMImpl> pImpl;
};

void PrettyMenu::changeBackground(istream& imgSrc) {
    using std::swap;
    Lock m1(&mutex);

    shared_ptr<PMImpl> pNew(new PMImpl(*pImpl)); // ① 현재 상태의 사본 생성
    pNew->bgImage.reset(new Image(imgSrc));       // ② 사본을 수정
    ++pNew->imageChanges;

    swap(pImpl, pNew);                            // ③ 성공하면 원본과 교체
}

핵심 원리: 실제 데이터(pImpl)를 별도 구조체(PMImpl)에 분리하고, 변경 작업을 사본(pNew)에만 수행한다. new Image(imgSrc)에서 예외가 발생해도 원본 pImpl은 전혀 건드리지 않은 상태이므로, 프로그램 상태가 함수 호출 이전과 동일하게 유지된다(강력한 보장). swap은 예외를 던지지 않으므로 ③ 단계는 안전하다.

출처: game_dev/cpp/chapter5/2025-09-14-cpp_5_29.md


Q4. 🟢 쉬움

문제: 빈칸을 채우시오.

  • ___①은(는) 실행 전 상태로, 코드와 데이터로 구성된 파일이다.
  • __②은(는) ①이 실행되어 메모리에 적재된 상태이며, 코드·데이터 영역 외에 __③(동적 메모리)과 ___④(함수 호출 기록 및 로컬 변수) 영역이 추가된다.
  • 여러 개의 ②가 동시에 실행되는 것을 ___⑤이라 한다.

정답:

① 프로그램 ② 프로세스 ③ 힙(Heap) ④ 스택(Stack) ⑤ 멀티프로세싱

해설:

프로그램은 디스크에 저장된 실행 파일로 실행 전 정적 상태이다. 프로세스는 프로그램이 OS에 의해 메모리에 적재되어 실행 중인 상태로, 코드·데이터 영역(프로그램에서 가져옴)에 더해 동적 메모리를 위한 과 함수 호출 스택을 위한 스택 영역이 추가된다. 여러 프로세스가 동시에 실행되는 것을 멀티프로세싱이라 하며, 작업 관리자에서 동일 프로세스가 여러 개 보이는 것이 예시이다.

출처: server/game_server/1/2025-04-25-game_server_1_1.md


Q5. 🟡 보통

문제: 게임 서버 DB를 설계할 때, Character 테이블의 OwnerUserAccountID 컬럼은 UserAccount 테이블의 기본 키(ID)를 참조하는 외래 키이며, 한 유저가 여러 캐릭터를 소유할 수 있다.

이 컬럼에 설정할 인덱스로 가장 적절한 것은?

  • A. 기본 키(Primary Key) — 값이 유일해야 하고 NULL을 허용하지 않는다
  • B. 유니크 인덱스(Unique Index) — 중복 값을 허용하지 않는 인덱스
  • C. 논유니크 인덱스(Non-unique Index) — 중복 값을 허용하면서 검색 속도를 높이는 인덱스
  • D. 인덱스 없음 — 외래 키 컬럼에는 별도 인덱스가 필요 없다

정답: C

해설:

OwnerUserAccountID는 한 유저가 여러 캐릭터를 소유할 수 있으므로, 같은 유저 ID가 여러 행에 반복될 수 있다. 따라서 중복을 허용하지 않는 기본 키(A)나 유니크 인덱스(B)는 적합하지 않다. 또한 외래 키 컬럼으로 CRUD(특히 특정 유저의 캐릭터 조회)가 자주 일어나므로 인덱스를 설정하지 않으면(D) 성능이 크게 저하된다. 중복 값을 허용하면서 검색 속도를 높이는 논유니크 인덱스(C)가 정답이다.

출처: server/game_server/7/2026-03-04-game_server_7_8.md


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

댓글남기기