[말랑 퀴즈] 26/08/24 문제
카테고리: MallangQuiz
태그: Quiz
제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.
말랑말랑 퀴즈 📝
날짜: 2026-08-24 문제 수: 5문제
Q1. 🔴 어려움
아래 C++ 코드를 보자. processWidget은 첫 인자로 shared_ptr<Widget>을, 둘째 인자로 우선순위 정수를 받는다.
int priority(); // 예외를 던질 수 있다
void processWidget(std::shared_ptr<Widget> pw, int priority);
int main() {
processWidget(std::shared_ptr<Widget>(new Widget), priority());
}
이 코드는 컴파일도 되고, 평소에는 잘 동작한다. 그런데 드물게 메모리 누수가 발생한다.
(1) 위 한 줄을 실행하기 위해 컴파일러가 해야 하는 연산 3가지를 쓰시오.
(2) 그 연산들이 어떤 순서로 실행될 때 누수가 발생하는가? 그 순서를 쓰고, 왜 하필 그 순서에서 객체가 새는지 끝까지 설명하시오.
(3) C++ 표준이 이 상황을 막아주지 않는 이유는 무엇인가?
(4) 이 코드를 안전하게 고치시오. 그리고 고친 코드에서는 (2)의 시나리오가 왜 더 이상 누수로 이어지지 않는지 설명하시오.
출처:
game_dev/cpp/chapter3/2025-06-13-cpp_3_17.md
📝 내 풀이:
(1) shared_ptr 생성자, Widget 생성자, new 객체 생성
(2,3,4) 이 부분에 대해서 잘 모르겠다.
Q2. 🟡 보통
다음 명제가 참(O)인지 거짓(X)인지 판단하라.
배틀그라운드처럼 넓은 월드에 캐릭터가 많은 게임에서는, 클라이언트가 언덕 너머의 보이지도 않는 캐릭터 정보까지 받을 필요가 없다. 그래서 서버는 가시영역 안에 있는 것만 골라서 보내 네트워크 부하를 줄인다.
이를 위해 서버는 “플레이어 각각이 볼 수 있는 캐릭터 목록” 을 실시간으로 유지한다. 이 목록 하나만 제대로 관리하면 가시영역 기반 전송에 필요한 정보는 전부 확보되므로, 그 이상의 목록을 따로 둘 필요는 없다.
출처:
server/game_server/5/2026-02-15-game_server_5_4.md
📝 내 답: O
Q3. 🟡 보통
이미 레코드가 1억 개 쌓인 서비스에서, 기획 변경으로 유저 데이터에 필드를 하나 추가해야 하는 상황이다. 이 상황과 관련해 관계형 데이터베이스(RDBMS)와 NoSQL을 비교한 설명으로 가장 올바른 것은?
- A. 추가하는 필드가
null값을 허용하도록 선언하면 실제 레코드를 건드릴 필요가 없으므로, 1억 개짜리 테이블이라도 서비스 중단 없이 즉시 필드를 추가할 수 있다. - B. RDBMS는 기존 레코드 1억 개 전체에 필드를 추가해야 하므로 장시간 작동이 멈출 수 있다. 이는 RDBMS의 레코드가 리스트·배열 같은 고정된 평면 구조라서 생기는 문제이며, NoSQL은 레코드가 트리나 구조체 형태를 가질 수 있어 이런 구조 변경에 상대적으로 유연하다.
- C. 외래 키를 사용해 필드를 다른 테이블로 분리해 두면 구조 변경 비용이 사라지므로, 필드 구조가 자주 바뀌는 서비스라도 RDBMS로 계속 가는 것이 정답이다.
- D. NoSQL이 유리한 이유는 레코드 구조가 유연해서가 아니라, 애초에 데이터를 디스크가 아닌 메모리에만 보관해 필드 추가 연산 자체가 필요 없기 때문이다.
출처:
server/game_server/8/2026-03-08-game_server_8_1.md
📝 내 선택: B
Q4. 🟢 쉬움
빈칸을 채우시오.
컴퓨터 네트워크 통신의 국제 표준 모델인 ① ___ 모델은 7개의 계층으로 나뉜다.
그중 2계층은 ② ___ 계층으로, 아래 그림처럼 단말기들이 ③ ___ 하나에 연결된 근거리 네트워크(LAN) 안에서의 통신을 담당한다. 이 계층에서 각 단말기는 고유한 ④ ___ 주소를 가지며, 데이터는 헤더 + 페이로드 구조의 프레임 단위로 오간다.
[💻 A] [💻 B]
\ /
[📁 ③ ]
/ \
[💻 C] [💻 D]
<——————— LAN ———————>
하지만 이 방식은 한 기기가 연결할 수 있는 단말기 수에 한계가 있다. 그래서 서로 다른 LAN끼리 이어 주는 3계층, 즉 ⑤ ___ 계층이 필요하며, 이 계층에서는 ⑥ ___ 가 경로를 정해 데이터를 다른 네트워크로 전달한다.
[단말기 A] - [스위치] - [ ⑥ ] - [스위치] - [단말기 B]
<—————— LAN 1 ——————> <—————— LAN 2 ——————>
출처:
server/game_server/2/2025-06-30-game_server_2_1.md
📝 내 답: OSI, 데이터 링크, 스위치, MAC, IP, 라우터
Q5. 🔴 어려움
세마포어는 0 이상의 정수 상태 값을 가진다. Wait()를 호출하면 값이 1 감소하고, Release()를 호출하면 1 증가한다. 값이 0인 상태에서 Wait()를 호출한 스레드는 값이 1 이상이 될 때까지 대기한다.
아래는 세마포어로 만든 생산자-소비자 코드다. 세마포어의 초깃값이 0인 점에 주목하라.
Queue queue;
Semaphore queueIsNotEmpty;
void Main() {
queueIsNotEmpty = new Semaphore(0); // 초깃값 0
}
void Thread1() { // 소비자
while (true) {
queueIsNotEmpty.Wait();
queue.PopFront();
}
}
void Thread2() { // 생산자
while (true) {
queue.PushBack();
queueIsNotEmpty.Release();
}
}
(1) 이 코드에서 세마포어의 상태 값은 무엇과 같아지는가? 그리고 초깃값을 0으로 준 이유는 무엇인가?
(2) 만약 소비자 스레드에서 queueIsNotEmpty.Wait(); 한 줄을 지운다면 어떤 일이 벌어지는가? 프로그램에 실제로 나타나는 증상까지 설명하시오.
(3) 세마포어의 초깃값을 1로 주면, 이 세마포어는 사실상 무엇처럼 동작하게 되는가?
(4) 이 상황을 세마포어 대신 이벤트(Event) 로 구현할 수도 있는데, 그럼에도 세마포어가 더 자연스러운 이유는 무엇인가?
출처:
server/game_server/1/2025-06-18-game_server_1_14.md
📝 내 풀이:
(1) 모르겠다.
(2) 스레드 1이 계속 실행되어 멀티스레딩의 의미가 없어진다. 프로그램이 뚝뚝 끊긴다.
(3) 싱글스레딩처럼 동작한다.
(4) 모르겠다.
댓글남기기