[말랑 퀴즈] 26/08/19 문제
카테고리: MallangQuiz
태그: Quiz
제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.
말랑말랑 퀴즈 📝
날짜: 2026-08-19 문제 수: 5문제
Q1. 🟡 보통
아래는 어떤 프로토콜로 데이터를 주고받는 두 프로그램의 의사 코드이다.
// 송신자
main() {
s = socket(???);
s.bind(any_port);
s.connect("55.66.77.88:5959");
s.send("hello");
s.close();
}
// 수신자
main() {
s = socket(???);
s.listen(5959);
s2 = s.accept();
while(true) {
r = s2.recv();
if(r.length == 0) break;
print(r);
}
s2.close();
}
송신자가 send("a"), send("bb"), send("ccc"), send("dddd")를 연속으로 호출했을 때, 위 코드의 프로토콜에 대한 설명으로 가장 올바른 것은?
- A. 수신자는 반드시
"a","bb","ccc","dddd"네 개의 메시지를 경계가 유지된 채로 그대로 받는다. - B. 수신자는
"abb","cccdddd"처럼 데이터가 뭉치거나 쪼개진 형태로 받을 수 있으며,recv()가 0바이트를 반환하면 연결 종료를 의미한다. - C. 이 프로토콜은 1:N 통신을 지원하므로 하나의 소켓으로 여러 수신자에게 동시에 브로드캐스트할 수 있다.
- D. 데이터 유실이 발생해도 재전송하지 않으므로, 애플리케이션이 직접 데이터 검사와 재전송을 구현해야 한다.
출처:
server/game_server/2/2025-12-04-game_server_2_6.md
📝 내 선택: B
Q2. 🟡 보통
게임 서버에서 DB 질의 구문을 실행할 때, 아래 두 코드는 동일한 SELECT 결과를 다루는 코드이다.
// (가)
DbRecordSet rs = cmd.Execute("select (a,b,c) from table1 where a>=?");
foreach(DbRecord r in rs) {
int a = r.GetField("a");
int b = r.GetField("b");
string c = r.GetField("c");
}
// (나)
DbRecordSet rs = cmd.Execute("select (a,b,c) from table1 where a>=?");
foreach(DbRecord r in rs) {
DbVariable vA = r.GetField("a");
if(vA.isNull() == false) int a = vA.Convert(int);
// b, c도 동일한 방식으로 처리
}
(나) 방식이 (가)보다 권장되는 이유를 설명하고, 같은 맥락에서 INSERT 구문을 작성할 때 질의 문자열에 값을 직접 하드 코딩("insert into table1 (a,b,c) values (123,456,789)")하는 대신 어떤 방식을 써야 하는지 서술하시오.
출처:
server/game_server/7/2026-03-06-game_server_7_10.md
📝 내 풀이:
SQL 인젝션 공격을 받을 수 있기 때문이다.
(나) 방식과 비슷하게 변수를 받아서 검증하고 명령 구문을 실행하도록 한다.
Q3. 🔴 어려움
다음 명제가 참(O)인지 거짓(X)인지 판단하라.
게임 서버 내부 데이터 전체가 뮤텍스 1개로만 보호되고, 서버 로직이 DB·파일 액세스 같은 디바이스 대기 시간 없이 CPU 계산만 수행한다면, 워커 스레드를 CPU 코어 개수만큼 늘리는 멀티스레드 방식이 처리량 향상에 가장 효과적이다.
출처:
server/game_server/6/2026-03-01-game_server_6_9.md
📝 내 답: X. 내부 데이터 전체가 잠기기 때문에 의미가 없어진다?
Q4. 🟢 쉬움
빈칸을 채우시오.
게임 네트워크 엔진 프라우드넷(ProudNet)의 기본 네트워크 모듈은 두 가지다.
- ①
___클래스: 게임 서버의 메인 모듈로, 클라이언트 연결을 받아들이고 메시지를 주고받으며, 각 클라이언트의 네트워크 상황을 열람할 수 있다. - ②
___클래스: 게임 클라이언트의 네트워크 모듈로, 서버로 연결을 맺고 메시지를 주고받으며, 다른 클라이언트와 ③___통신도 가능하다.
출처:
server/game_server/6/2026-02-18-game_server_6_2.md
📝 내 답: 기억이 나지 않는다.
Q5. 🔴 어려움
다음 C++ 코드를 보자. (MinimumPasswordLength는 상수이며, string은 std::string이다.)
string encryptPassword(const string& password) {
string encrypted;
if(password.length() < MinimumPasswordLength) {
throw logic_error("Password is too short");
}
// ... encrypted를 채우는 작업 ...
return encrypted;
}
(1) 위 코드에서 발생하는 불필요한 비용 두 가지를 지적하고, 이를 제거한 개선 코드를 작성하시오.
생성자와 소멸자. encrypted는 잠깐을 위해 생성되고 소멸된다.
string& encrypted를 변수의 인자로 넣는 방법이 생각난다.
(2) 아래 두 루프 작성 방식에 대해, 각각 생성자·소멸자·대입 연산이 몇 번 호출되는지 밝히고, 어떤 상황에서 B 방법이 유리한지 서술하시오.
// A 방법
Widget w;
for(int i=0; i<n; ++i) {
w = i에 따라 달라지는 값;
}
// B 방법
for(int i=0; i<n; ++i) {
Widget w(i에 따라 달라지는 값);
}
출처:
game_dev/cpp/chapter5/2025-07-04-cpp_5_26.md
📝 내 풀이:
A: 생성 1, 대입 n, 소멸 1 B: 생성 n, 대입 0, 소멸 n
반복문 내에서 잠깐 쓰고 버려지는 변수를 위해
댓글남기기