[말랑 퀴즈] 26/10/19 문제
카테고리: MallangQuiz
태그: Quiz
제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.
말랑말랑 퀴즈 📝
날짜: 2026-10-19 문제 수: 6문제
Q1. 🟢 쉬움
다음 명제가 참(O)인지 거짓(X)인지 판단하라.
플레이어 간 상호 작용(PVP)은 정확해야 하고, 지연 시간에 큰 영향을 받으며, 기관총 발사처럼 횟수가 매우 잦을 때도 있다. 그래서 플레이어 간 상호 작용은 일반적으로 여러 서버에 분산하여 처리하는 것이 권장된다.
출처:
server/game_server/9/2026-03-29-game_server_10_5.md
📝 내 답: X. 잦으며 응집도가 큰 작업은 하나의 서버에서 하는 것이 권장된다
Q2. 🟡 보통
아래 그림은 IP 패킷의 구조다. IP 패킷, 스트림, 메시지에 대한 설명으로 가장 올바른 것은?
- A. IP 패킷 하나의 크기는 제한되어 있지만, 네트워크 스택이 데이터를 여러 조각으로 나누어 보내고 수신자가 조립해 복원해 주므로, 스트림과 메시지를 쓰는 쪽에서는 패킷 크기 제한을 신경 쓸 필요가 없다.
- B. 스트림은 송신자가 보낸 데이터 개수와 수신자가 받는 데이터 개수가 같고, 보낸 데이터의 시작과 끝이 받는 데이터와 같다.
- C. 메시지는 자체적으로 데이터의 시작과 끝을 구별하지 못하므로, 사용자가 직접 데이터를 끊어서 읽어야 한다.
- D. IP 패킷의 체크섬은 수신자가 송신자를 식별하는 용도로 쓰인다.
출처:
server/game_server/2/2025-07-10-game_server_2_3.md
📝 내 선택: A.
B: 해당 설명은 메시지에 대한 것이다
C: 해당 설명은 스트림에 대한 것이다
D. IP 패킷의 무결성을 위한 것이다.
Q3. 🟡 보통
빈칸을 채우시오.
MongoDB에서 컬렉션 coll1의 도큐먼트를 다루는 명령에 대한 설명이다.
- 컬렉션에 도큐먼트
{"a":1}을 추가하는 명령은db.coll1.①___({"a":1})이다. (SQL의 insert에 대응하는 함수 이름, 영문 소문자) - 조건에 맞는 도큐먼트 중 첫 번째로 나오는 하나만 출력하는 함수는
db.coll1.②___()이다. (영문 camelCase 함수 이름) a가 1인 도큐먼트의 값을 5로 바꾸는 명령은db.coll1.update({"a":1}, {$③___:{"a":5}})이다. (달러 기호 뒤에 오는 영문 소문자 세 글자, 값을 지정한다는 뜻)a가 3인 도큐먼트를 삭제하는 명령은db.coll1.④___({"a":3})이다. (SQL의 delete에 대응하는 함수 이름, 영문 소문자)
출처:
server/game_server/8/2026-03-11-game_server_8_6.md
📝 내 답: insert, findOne, set, remove
Q4. 🟡 보통
다음 명제가 참(O)인지 거짓(X)인지 판단하라.
클래스 템플릿
Widget<T>에 대해swap을 지원하려고std네임스페이스 안에template<typename T> void swap(Widget<T>& a, Widget<T>& b)를 오버로딩으로 추가하면, 컴파일도 되고 표준에도 어긋나지 않으므로 안전한 해결 방법이다.
출처:
game_dev/cpp/chapter4/2025-07-02-cpp_4_25.md
📝 내 답: X. std 네임스페이스에 완전 템플릿 특수화는 허용하지만, 템플릿 추가는 불가능하다.
Q5. 🟡 보통
아래 코드에서 value(std::move(text))를 실행할 때 실제로 호출되는 std::string의 생성자는 무엇인가?
class Annotation {
public:
explicit Annotation(const std::string text)
: value(std::move(text))
{ … }
private:
std::string value;
};
- A. 이동 생성자
- B. 복사 생성자
- C. 어느 생성자도 호출되지 않고 컴파일 오류가 난다.
- D. 기본 생성자
출처:
game_dev/moderncpp/5/2026-09-10-moderncpp_5_23.md
📝 내 선택: A. move 함수는 통해 string의 이동 생성자를 호출한다.
Q6. 🔴 어려움 · 📌 오답노트 (3번째 복습)
C++의 const에 대해 답하시오.
(1) 아래 세 포인터 선언에서 각각 포인터 자체를 수정할 수 있는지, 가리키는 데이터를 수정할 수 있는지 쓰시오.
char greeting[] = "Hello";
const char * p1 = greeting;
char * const p2 = greeting;
const char * const p3 = greeting;
(2) 아래 코드에서 const vector<int>::iterator it와 vector<int>::const_iterator cit는 각각 *it = 10;, ++it;, *cit = 10;, ++cit; 중 무엇이 가능하고 무엇이 불가능한가?
vector<int> vec;
const vector<int>::iterator it = vec.begin();
vector<int>::const_iterator cit = vec.begin();
(3) 아래 코드는 operator[]가 const 멤버 함수이므로 컴파일은 되지만, 상수 객체 cctb의 내용이 바뀐다. 이런 일이 벌어지는 이유를 “비트수준(물리적) 상수성”의 정의와 연결해 설명하고, 이를 보완하기 위해 나온 개념(논리적 상수성)의 정의를 쓰시오.
class CTextBlock {
public:
char& operator[](size_t position) const { return pText[position]; }
private:
char* pText;
};
const CTextBlock cctb("Hello");
char* pc = &cctb[0];
*pc = 'J';
(4) 아래 length()는 값을 캐시해 두려고 const 멤버 함수 안에서 멤버를 수정하다가 에러가 난다. 에러가 나는 이유와 해결 방법(키워드와 그것을 붙일 대상)을 쓰시오.
class CTextBlock {
public:
size_t length() const;
private:
char* pText;
size_t textLength;
bool lengthIsValid;
};
size_t CTextBlock::length() const {
if(!lengthIsValid) {
textLength = strlen(pText);
lengthIsValid = true;
}
return textLength;
}
출처:
game_dev/cpp/chapter1/2025-04-06-cpp_1_3.md오답노트:wn-628f38c5· 2026-09-10 최초 오답 · 이번이 3번째 복습
📝 내 풀이: (1) const char * 는 포인터 O, 데이터 X
char * const 는 포인터 X, 데이터 O
const char * const는 포인터 X, 데이터 X
(2) *it=10 O, ++it X, *cit=10 X, ++cit O
(3) 비트수준 상수성은 어떤 비정적 데이터 멤버라도 수정이 되지 않아야 const라는 규칙이다.
하지만 내부에서 지켜진다 하더라도, 내부 참조값을 반환해버리는 경우 이러한 규칙이 깨진다.
이를 위해 나온것이 논리적 상수성으로, 외부에서 알아차리지 못하게 내부 상태를 수정하면 괜찮다는 규칙이다.
(4) textLength와 lengthIsValid의 값을 변경하고 있기 때문이며, 이들 자료형 앞에 mutable을 붙여주면 된다.
댓글남기기