[말랑 퀴즈] 26/09/23 해답

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 — 해답지 ✅

날짜: 2026-09-19 문제 수: 6문제 총점: 55/60 (92점) 🏆 훌륭해요

📊 채점 결과

문항 유형 난이도 결과 점수
Q1 객관식 🟡 보통 ⭕ 정답 10 / 10
Q2 빈칸 🟢 쉬움 🔺 부분 정답 9.3 / 10
Q3 객관식 🟡 보통 ⭕ 정답 10 / 10
Q4 빈칸 🟡 보통 🔺 부분 정답 6.7 / 10
Q5 OX 🟢 쉬움 ⭕ 정답 10 / 10
Q6 OX · 📌 오답노트 🟡 보통 🔺 부분 정답 9 / 10
합계       55 / 60

총평

전반적으로 훌륭합니다. 객관식 두 문제(Q1, Q3)는 오답 보기까지 하나하나 근거를 대며 정확히 반박하셨고, OX 두 문제(Q5, Q6)도 판단과 핵심 근거를 정확히 짚었습니다. 특히 Q6은 4일 전에 만들었던 오답노트 문제인데도 “타임아웃 없이 영원히 블로킹될 수 있다”는 핵심을 정확히 기억하고 계셨습니다.

빈칸 채우기 두 문제(Q2, Q4)에서 점수가 조금 깎였습니다. Q2는 “연합체”를 “집합”으로 약간 다르게 표현한 정도라 큰 감점은 아니지만, Q4는 포트의 바이트 수(2바이트)를 빠뜨리고 최댓값도 65535 대신 32768(부호 있는 15비트 최댓값과 혼동한 것으로 보임)을 적어 이 부분만 짚어 보면 좋겠습니다.


Q1. 🟡 보통 — ⭕ 10/10

문제: 게임 서버를 인증 서버 1대 + 채널 서버 여러 대로 나누는 고전적인 분산 구조에 대한 설명으로 가장 올바른 것은?

  • A. 인증 데이터베이스와 채널 데이터베이스는 반드시 하나로 통합해서 관리해야 하며, 채널 서버 수가 늘면 인증 서버도 그에 비례해 늘려야 한다.
  • B. 채널 서버마다 별도의 데이터베이스를 두며, 클라이언트는 인증 서버에서 로그인을 마친 뒤 채널 서버를 선택해 접속한다. 국가별로 채널을 분리하는 것이 일반적이고, 채널 선택 과정을 아예 숨겨 하나의 채널만 있는 것처럼 보이게 만들 수도 있다.
  • C. 채널 서버 선택은 로그인보다 먼저 이루어지며, 인증 서버가 각 채널 서버의 실시간 부하를 모니터링해 자동으로 채널을 배정해 준다.
  • D. 인증 서버는 로직을 계속 확장해야 하는 서버이며, 채널 서버들은 하나의 데이터베이스를 공유해야 데이터 정합성이 보장된다.

📝 내 답: B — A: 통합해서 관리하면 안된다. 뒷줄은 채널 서버가 아니라 접속량에 따라 늘려야 했던 것으로 기억한다. / C: 로그인 이후, 채널 서버 선택이 이루어진다. / D: 인증 서버는 접속만 담당하며, 같은 데이터베이스를 공유하면 오버헤드로 인해 분산하는 의미가 없어진다.

정답: B

해설:

고전적인 분산 서버 구조는 인증 서버 1대 + 채널 서버 여러 대(예: 4대)로 이루어진다.

  • 인증 서버: ID/PW 인증 로직 + 인증 전용 데이터베이스. 로직은 확장할 수는 있지만 그럴 필요는 거의 없다.
  • 채널 서버: 각각 자기 자신의 데이터베이스를 따로 가진다. 하나로 통합하지 않는다.
  • 흐름: 클라이언트 → 인증 서버 접속·로그인 → 채널 서버 선택·접속.
  • 특징: 국가별로 채널을 나누는 것이 일반적이며, 채널 선택 과정 자체를 숨겨 사용자에게는 채널이 하나만 있는 것처럼 보이게 할 수도 있다.

  • A — 반대다. 인증 DB와 채널 DB는 분리되어 있고, 인증 서버는 채널 서버 수에 비례해 늘릴 필요가 없다.
  • C — 로그인이 채널 선택보다 먼저이며, 원문에는 “실시간 부하 모니터링 후 자동 배정” 같은 내용이 없다.
  • D — 인증 서버는 확장할 필요가 거의 없는 서버고, 채널 서버들은 DB를 공유하지 않고 각자 갖는다.

🔍 피드백: 만점입니다. B를 고른 것뿐 아니라 A·C·D를 하나씩 왜 틀렸는지 정확히 짚으신 점이 좋습니다. 다만 A에 대한 메모 중 “접속량에 따라 늘려야 했던 것”이라는 부분은 이 포스트 원문에는 없는 내용(다른 단원 내용과 섞이신 듯합니다) — A가 틀린 핵심 이유는 “DB를 통합 관리한다”는 것 자체이므로, 그 이유만으로도 충분히 오답 처리할 수 있었습니다.

출처: server/game_server/9/2026-03-17-game_server_9_3.md


Q2. 🟢 쉬움 — 🔺 9.3/10

문제: 빈칸을 채우시오.

C++은 하나의 언어라기보다 여러 하위 언어의 ① ___(으)로 보아야 한다는 것이 항목 1의 요지다. 이를 구성하는 하위 언어는 총 ② ___가지 — ③ ___, ④ ___, ⑤ ___, ⑥ ___ — 이다.

📝 내 답: 집합, 4, C, STL, 템플릿, 객체 지향

정답:

① 연합체 ② 네 (4) ③ C ④ 객체 지향 개념의 C++ ⑤ 템플릿 C++ ⑥ STL

해설:

C++을 하나의 언어로 뭉뚱그려 보면 헷갈리기 쉽다. 원문은 C++을 네 가지 하위 언어의 연합체로 보라고 말한다 — C, 객체 지향 개념의 C++, 템플릿 C++, STL. 이 네 하위 언어는 각각 규칙이 달라서, 어느 하위 언어 안에 있는지에 따라 “좋은 코드”의 기준이 달라진다. ③~⑥의 순서는 바뀌어도 무방하다.

🔍 피드백: ②~⑥은 만점입니다. 숫자(4)와 네 하위 언어(C, 객체 지향 C++, 템플릿 C++, STL)를 순서 상관없이 정확히 모두 나열하셨습니다 — “템플릿”, “객체 지향”처럼 뒤에 “C++”을 생략한 것도 의미가 분명해서 감점하지 않았습니다.

①만 부분 감점했습니다. “집합”이라고 쓰셨는데, 원문 용어는 “연합체”입니다. “여러 개가 모였다”는 뜻은 통하지만, “집합”은 그냥 모아놓은 것이라는 뉘앙스고 “연합체”는 서로 다른 규칙을 가진 하위 언어들이 각자 정체성을 유지한 채 연합해 있다는, 이 항목이 강조하려는 뉘앙스를 담고 있습니다. 다음엔 “연합체”라는 표현 자체를 기억해 두시면 좋겠습니다.

출처: game_dev/cpp/chapter1/2025-01-02-cpp_1_1.md


Q3. 🟡 보통 — ⭕ 10/10

문제: 멀티스레드 게임 서버(CPU 8코어)에서 스레드를 몇 개 만들지에 대한 설명으로 가장 올바른 것은?

  • A. CPU보다 스레드 개수가 많으면 항상 처리 속도가 빨라진다. 컨텍스트 스위치는 스레드가 많을수록 오히려 줄어들기 때문이다.
  • B. 스레드 8개로 CPU 8코어를 모두 채우면 컨텍스트 스위치 없이 CPU를 100% 활용할 수 있다. 다만 작업의 75%가 IO 대기라면, 스레드가 대기하는 동안 CPU가 다른 스레드를 처리할 수 있도록 스레드 수를 CPU 개수의 3~4배 정도로 늘리는 것이 유리하다.
  • C. 스레드는 대기 상태에 들어가도 CPU를 계속 점유하므로, IO 대기가 많은 작업일수록 스레드 수를 CPU 개수보다 적게 유지해야 한다.
  • D. 클라이언트 수만큼 스레드를 만드는 방식은 메모리를 조금 더 쓰는 것 말고는 단점이 없으며, 컨텍스트 스위치 비용은 전혀 발생하지 않는다.

📝 내 답: B — A: 컨텍스트 스위치는 스레드가 많을수록 더 많이 생기므로, 처리 속도가 오히려 느려진다. / C: 대기 상태에 들어가면 CPU를 점유하진 않고 놀고만 있는다. IO 대기가 많을수록 오히려 늘려야 한다. / D: 많은 클라이언트가 있다면 스레드를 많이 만들어야하는데 불가능해진다. 컨텍스트 스위치 비용은 접속/해제에서 발생한다.

정답: B

해설:

CPU 개수와 스레드 개수의 관계

상황 컨텍스트 스위치 비고
CPU > 스레드 없음 CPU 자원을 100% 활용하지 못함
CPU = 스레드 없음 CPU 자원 100% 활용
CPU < 스레드 발생 오히려 처리 속도가 나빠질 수 있음

그런데 스레드는 자주 잠을 잔다(대기 상태) — 이때 CPU는 놀고 있다. IO 대기가 많은 작업(예: 총 처리 시간의 75%가 IO 대기)이라면, 스레드 수를 CPU 개수보다 3~4배 많게 두어야 한 스레드가 대기하는 동안 CPU가 다른 스레드의 작업을 처리할 수 있다.

  • A — 반대다. CPU보다 스레드가 많아지면 컨텍스트 스위치가 발생하며, 무조건 빨라지는 것이 아니라 오히려 나빠질 수도 있다.
  • C — 스레드가 대기 상태(waitable state)에 들어가면 CPU를 점유하지 않는다. 그래서 IO 대기가 많을수록 스레드를 더 많이 두어야 그 유휴 시간을 활용할 수 있다.
  • D — 클라이언트마다 스레드를 만들면 메모리 낭비뿐 아니라 컨텍스트 스위치 증가로 실제 작업보다 전환 비용이 커지는 문제가 있다.

🔍 피드백: 만점입니다. C에 대한 반박(“대기 상태에 들어가면 CPU를 점유하지 않는다”)이 특히 정확합니다 — 이번 회차 오답노트 문제(Q6)의 핵심 개념과도 이어지는 부분인데 잘 짚으셨습니다. D에 대한 메모의 “컨텍스트 스위치 비용은 접속/해제에서 발생한다”는 원문에 직접 나온 표현은 아니지만, “클라이언트마다 스레드를 만드는 방식 자체가 틀렸다”는 결론은 정확해서 감점하지 않았습니다.

출처: server/game_server/1/2025-06-16-game_server_1_12.md


Q4. 🟡 보통 — 🔺 6.7/10

문제: 빈칸을 채우시오.

IPv4 주소는 ① ___ 비트, IPv6 주소는 ② ___ 비트로 이루어진다. 포트는 ③ ___ 바이트의 정수로, 최대 ④ ___ 이하의 값을 배정해 쓸 수 있다. IP 주소와 포트를 함께 묶어 부르는 용어를 ⑤ ___(이)라 하고, www.naver.com에서 www에 해당하는 부분을 ⑥ ___(이)라 부른다.

📝 내 답: 32, 128, 32768, 엔드포인트, 호스트 네임

정답:

① 32 ② 128 ③ 2 ④ 65535 ⑤ 끝점(endpoint) ⑥ 호스트 이름

해설:

IPv4는 8비트씩 4묶음, 총 32비트로 이루어지며 이론상 $2^{32}$개까지 배정할 수 있다. IPv6는 16비트씩 8묶음, 총 128비트로 $2^{128}$개까지 배정 가능하다.

포트는 한 IP 주소 안에서 어떤 프로그램이 주고받는 데이터인지 식별하는 역할을 하며, 2바이트 정수라서 65535(=$2^{16}-1$) 이하의 값만 쓸 수 있다. 11.22.33.44:5처럼 주소와 포트를 묶는 방식을 끝점(endpoint)이라 부른다.

www.naver.com처럼 도메인 이름 앞에 붙어 네트워크에 연결된 개별 컴퓨터·장치를 가리키는 이름호스트 이름이고, naver.com처럼 인터넷 상의 그룹을 나타내는 문자열이 도메인 이름이다.

🔍 피드백: ①②⑤⑥은 정확합니다 (⑤ “엔드포인트”는 “끝점(endpoint)”과 같은 말이라 정답 처리했고, ⑥ “호스트 네임”도 “호스트 이름”과 같은 표현입니다).

③④에서 감점되었습니다. 답안에 “32768” 하나만 적혀 있어, ③(포트가 몇 바이트인가)에 대한 답이 통째로 빠졌고, ④(포트의 최댓값)에도 정답인 65535 대신 32768을 적으셨습니다. 32768은 $2^{15}$ — 부호가 있는(signed) 16비트 정수의 최댓값입니다. 하지만 포트 번호는 부호 없는(unsigned) 2바이트 정수이므로 최댓값이 $2^{16}-1=$ 65535입니다. “2바이트 = 16비트인데, 부호 있는 정수와 헷갈려 15비트 기준으로 계산하지 않았는지” 확인해 보시면 좋겠습니다.

출처: server/game_server/2/2025-12-02-game_server_2_4.md


Q5. 🟢 쉬움 — ⭕ 10/10

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

JSON에서 값(Value)으로 쓸 수 있는 것은 문자열·숫자·객체뿐이며, 배열은 값으로 쓸 수 없다. 따라서 배열 안에 객체를 넣는 것도 JSON 문법에 어긋난다.

📝 내 답: X. 배열을 값으로 쓸수 있으며, 배열 안에 객체를 넣을수도 있다.

정답: X

해설:

JSON의 값(Value)에는 문자열, 숫자, 객체, 배열을 모두 넣을 수 있다 — 배열도 값으로 쓸 수 있는 정상적인 타입이다. 또한 배열 안에 객체를 넣는 것도 문법에 어긋나지 않는다.

{
	"a" : 1,
	"b" : "x",
	"c" : 100,
	"d" : {"x" : 50, "y" : "qp"},
	"e" : [99, 88, 77, {"pi" : 3.14, "r" : 1}]
}

위 예시의 "e" 필드가 바로 배열 안에 숫자와 객체가 함께 들어간 경우다.

🔍 피드백: 만점입니다. 판단과 근거 모두 정답 해설과 정확히 일치합니다 — 짧지만 핵심(배열도 값이 될 수 있다 + 배열 안 객체도 가능하다) 두 가지를 빠짐없이 짚으셨습니다.

출처: server/game_server/8/2026-03-09-game_server_8_4.md


Q6. 🟡 보통 · 📌 오답노트 — 🔺 9/10

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

블로킹 함수를 호출한 스레드는 waitable state가 되어 그 스레드의 CPU 사용량이 0%로 떨어진다. 이때 CPU 자체는 다른 어떤 작업도 전혀 할 수 없으므로, 블로킹은 사실상 CPU를 낭비시키는 것과 같다. 또한 네트워크 수신 함수는 내부적으로 일정 시간이 지나면 자동으로 타임아웃되어 리턴되므로, 상대방이 응답하지 않아도 스레드가 무한정 멈춰 있는 일은 없다.

📝 내 답: X. 맨 마지막 줄이 틀렸다. 기본 블로킹 소켓은 타임아웃시키지 않기에 영원히 묶여 있을 수 있다.

정답: X

해설:

앞부분 “블로킹 함수를 호출한 스레드는 waitable state가 되고 그 스레드의 CPU 사용량이 0%가 된다”는 이다. 하지만 이어지는 두 주장은 모두 거짓이다.

  1. “CPU 자체는 다른 작업을 전혀 할 수 없다”는 거짓이다. 0%가 되는 것은 그 스레드의 CPU 사용량이지, CPU 코어 자체가 멈추는 게 아니다. 노는 것은 스레드지 CPU가 아니며, CPU는 그사이 다른 스레드의 작업을 처리할 수 있다.
  2. “네트워크 수신 함수가 자동으로 타임아웃되어 무한정 멈추지 않는다”도 거짓이다. 원문은 정반대로 말한다 — 스레드에서 네트워크 수신 함수를 호출했는데 상대 컴퓨터가 데이터를 보내지 않으면, 영원히 블로킹이 발생한다. 자동 타임아웃 같은 안전장치는 없다.

🔍 피드백: 판단(X)은 정확하고, 근거로 드신 “타임아웃 없이 영원히 블로킹될 수 있다”도 명제의 두 번째 오류(위 2번)를 정확히 짚은 것입니다. 4일 전 만든 문제인데도 핵심을 정확히 기억하고 계셔서 반갑습니다.

다만 명제에는 오류가 두 군데였는데, 그중 하나(위 1번 — “CPU 자체가 다른 작업을 전혀 할 수 없다”는 부분, 즉 노는 것은 CPU가 아니라 스레드라는 점)는 짚지 못하셨습니다. 그래서 근거 점수에서 일부만 감점했습니다. “명제 안에 틀린 지점이 몇 개인지”까지 훑어보는 습관을 들이면 이런 복합 오류 명제에서 만점을 놓치지 않을 수 있습니다.

출처: server/game_server/3/2025-12-16-game_server_3_1.md 오답노트: wn-7193e4e7 · 2026-09-10 최초 오답 · 이번이 2번째 복습


📌 복습 포인트

  • Q2 “연합체”라는 용어 — “집합”이 아니라 하위 언어가 각자 정체성을 유지한 채 모여 있다는 뜻의 연합체game_dev/cpp/chapter1/2025-01-02-cpp_1_1.md
  • Q4 포트의 바이트 수와 최댓값 — 포트는 2바이트(16비트) 부호 없는 정수, 최댓값은 65535($2^{16}-1$). 32768($2^{15}$)은 부호 있는 정수 기준이라 혼동하지 않을 것 → server/game_server/2/2025-12-02-game_server_2_4.md
  • Q6 블로킹의 “CPU 0%”가 의미하는 것 (오답노트, 3번째 복습 예정) — 노는 것은 스레드CPU가 아니다. CPU는 그 사이 다른 스레드를 처리할 수 있다 → server/game_server/3/2025-12-16-game_server_3_1.md

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

댓글남기기