📌 C++/C# 기반 게임 클라이언트 면접 자료구조 질문 모음
다음은 실제 면접 사례와 실무 경험을 기반으로 구성한 C++ 및 C# 게임 클라이언트 면접에서 자주 나올 수 있는 자료구조 질문입니다. 각 질문은 기본 답변과 심화 질문 및 그에 대한 답변까지 포함하여 구성되어 있습니다.
✅ 1. std::vector와 List<T> 차이점
Q. C++의 std::vector와 C#의 List<T>는 어떤 차이가 있나요?
답변: 둘 다 동적 배열 구조로, 요소를 연속된 메모리에 저장하며 자동으로 크기를 확장합니다. 성능, 메모리 관리, 인터페이스는 유사하지만, C++의 std::vector는 명시적인 메모리 제어가 가능하고, C#의 List<T>는 GC의 영향을 받습니다.
심화 질문: GC가 List<T> 성능에 어떤 영향을 주나요?
답변: List<T>가 큰 객체를 다룰 때 빈번한 할당/해제가 발생하면 GC가 자주 동작해 성능에 영향을 줄 수 있습니다. 특히 Unity에서는 GC 할당을 최소화하는 구조 설계가 중요합니다.
✅ 2. 배열과 LinkedList의 선택 기준
Q. 배열과 연결 리스트 중 어떤 자료구조를 언제 선택하나요?
답변: 요소 개수가 고정되거나 인덱스 기반 접근이 잦을 경우 배열이 유리합니다. 삽입/삭제가 빈번한 경우 연결 리스트가 적절합니다. 그러나 캐시 적중률과 메모리 관리를 고려하면 실제로는 배열(Vector/List)이 더 많이 사용됩니다.
심화 질문: C#의 LinkedList<T>는 실무에서 자주 사용되나요?
답변: 실시간성이 중요한 게임에서는 거의 사용되지 않습니다. GC 비용이 크고, 참조 구조로 인해 캐시 효율이 떨어지기 때문입니다.
✅ 3. Dictionary와 unordered_map의 차이
Q. C#의 Dictionary<K,V>와 C++의 unordered_map의 차이점은?
답변: 둘 다 해시 기반의 키-값 저장 자료구조로 평균 O(1) 접근 속도를 가집니다. unordered_map은 C++11부터 제공되며, 커스텀 해시/비교 함수 구현이 가능합니다. Dictionary<K,V>는 C#의 기본 해시맵으로 GC 관리하에 동작합니다.
심화 질문: 커스텀 타입을 key로 사용할 때 주의할 점은?
답변: C++에선 std::hash와 == 연산자 오버로딩이 필요하고, C#에선 GetHashCode()와 Equals()를 반드시 오버라이드해야 합니다.
✅ 4. 큐와 스택의 활용
Q. C++과 C#에서 큐와 스택은 각각 어떤 용도로 쓰이나요?
답변: 큐는 이벤트 큐, 네트워크 패킷 처리 등 순차적 처리가 필요한 경우에 사용됩니다. 스택은 되돌리기, 상태 저장, 재귀적인 탐색 등에 유용합니다.
심화 질문: Unity/C#에서 Stack<T> 대신 배열을 사용할 수 있나요?
답변: 가능하지만 Stack<T>는 내부적으로 배열을 캡슐화하고 API가 명확하기 때문에 유지보수성과 안전성 면에서 더 선호됩니다.
✅ 5. HashSet<T>와 unordered_set의 용도
Q. C#의 HashSet<T>와 C++의 unordered_set은 언제 사용하나요?
답변: 중복 없는 데이터 저장과 빠른 포함 여부 확인 시 사용됩니다. 예를 들어 공격 대상 체크, 중복 요청 방지 등에 활용됩니다.
심화 질문: HashSet을 사용하면 순서가 유지되나요?
답변: 아니요. 해시 기반이므로 삽입 순서를 보장하지 않습니다. 삽입 순서가 중요할 경우 List<T>나 LinkedHashSet 유사 구조가 필요합니다.
✅ 6. 링 버퍼(Ring Buffer)
Q. 링 버퍼는 어떤 상황에서 유용한가요?
답변: 네트워크 패킷 처리, 오디오 스트리밍, 입력 버퍼 등에서 메모리 재할당 없이 순환적으로 데이터를 처리할 때 사용됩니다.
심화 질문: 일반 배열로 링 버퍼를 어떻게 구현하나요?
답변: head와 tail 인덱스를 관리하여, (tail + 1) % capacity == head 상태가 되면 버퍼가 가득 찼음을 의미합니다. 순환 시 인덱스는 모듈러 연산으로 관리합니다.
✅ 7. 스파셜 해싱(Spatial Hashing)
Q. 게임에서 스파셜 해싱은 어떤 용도로 사용되나요?
답변: 넓은 공간에서 객체를 빠르게 탐색하기 위해 위치 값을 해시 키로 변환하여 인접 객체를 빠르게 조회합니다. 충돌 검사나 AI 탐지 범위 처리에 많이 사용됩니다.
심화 질문: 위치를 해시 키로 바꾸는 기준은?
답변: 공간을 일정 그리드 크기로 나누고, 좌표를 격자 단위로 나눈 값을 int로 변환하여 해시 키로 사용합니다. 예: (int)(x / cellSize), (int)(y / cellSize)
✅ 8. C# vs C++ 자료구조 성능 이슈
Q. C++과 C#에서 같은 자료구조라도 성능 차이가 나는 이유는 무엇인가요?
답변: C++은 수동 메모리 관리와 컨테이너 최적화가 가능하고, GC가 없기 때문에 예측 가능한 성능을 제공합니다. C#은 관리형 메모리 구조로 GC의 영향과 박싱/언박싱 비용 등이 성능 차이로 이어질 수 있습니다.
심화 질문: Unity 환경에서는 어떤 자료구조 사용이 바람직한가요?
답변: 구조체 기반의 배열, NativeArray, Span<T>, 풀링 구조 등을 활용해 할당을 최소화하고 GC를 피하는 방향이 좋습니다.
✅ 9. 트리 자료구조 (BST, AVL, Red-Black Tree)
Q. 이진 탐색 트리(BST)와 균형 트리(AVL, Red-Black Tree)의 차이는 무엇인가요?
답변: BST는 삽입 순서에 따라 한쪽으로 치우쳐질 수 있어 최악의 경우 시간복잡도가 O(n)입니다. AVL은 항상 높이 균형을 유지하여 O(log n)을 보장하며, 레드블랙 트리는 더 느슨한 균형 조건을 가지지만 연산 수가 적고 성능이 안정적이어서 실무에 많이 사용됩니다.
심화 질문: AVL 트리와 레드블랙 트리 중 삽입/삭제 시 어느 쪽이 더 효율적인가요?
답변: AVL은 삽입 후 더 자주 재균형이 필요하므로 삭제 연산에 불리할 수 있습니다. 레드블랙 트리는 재균형 조건이 느슨해서 삽입/삭제 연산이 더 효율적입니다.
✅ 10. 트리의 게임 내 활용
Q. 게임 클라이언트에서 트리 자료구조는 어떤 용도로 사용되나요?
답변: 트리는 계층 구조 표현에 적합합니다. 예: 씬 그래프(Scene Graph), UI 계층, 상태 트리, 행동 트리(Behavior Tree) 등에서 널리 사용됩니다. 트리 기반 구조는 연산을 하위 노드로 전파하거나 부모-자식 간 종속 관계를 처리할 때 유용합니다.
심화 질문: Unity에서 GameObject의 Transform 트리는 어떤 구조로 되어 있나요?
답변: Unity는 각 GameObject가 Transform 컴포넌트를 가지며 부모-자식 관계를 포인터로 연결하여 트리 구조를 이룹니다. 이는 트랜스폼 연산의 전파 및 계층 렌더링에 사용됩니다.
✅ 11. 그래프 자료구조 및 활용
Q. 게임에서 그래프 자료구조는 어떤 용도로 사용되나요?
답변: 그래프는 노드와 간선으로 구성된 일반화된 구조로, 경로 탐색, 맵 연결성, AI 네비게이션 메쉬(NavMesh), 전투 범위, 퍼즐 연결 구조 등에 사용됩니다.
심화 질문: 인접 리스트와 인접 행렬 중 어떤 방식이 더 적합한가요?
답변: 노드 수가 많고 연결 간선이 적은 경우(희소 그래프)는 인접 리스트가 메모리 효율이 좋고, 간선 탐색이 빈번한 경우(밀집 그래프)는 인접 행렬이 유리합니다.
✅ 12. 경로 탐색 알고리즘 (DFS, BFS, A*)
Q. A 알고리즘은 어떻게 동작하며, 게임에서는 어떻게 쓰이나요?*
답변: A*는 g(n): 현재까지의 비용 + h(n): 휴리스틱 비용의 합인 f(n)을 기준으로 탐색합니다. 우선순위 큐(Heap)를 사용하며, 휴리스틱이 정확할수록 빠르고 최적 경로를 도출할 수 있습니다. 게임에서는 유닛 이동, AI 추적 등에 활용됩니다.
심화 질문: A에서 사용하는 휴리스틱 함수는 어떤 조건을 만족해야 하나요?
답변: admissible(실제 비용을 과대평가하지 않음)해야 최적의 해를 보장할 수 있으며, consistent(삼각 부등식 만족)하면 A가 더 효율적으로 동작합니다.
✅ 13. B-Tree와 파일 시스템
Q. B-Tree는 어떤 상황에서 사용되며, BST나 AVL과는 어떻게 다른가요?
답변: B-Tree는 균형 다항 트리로, 노드에 여러 키와 자식 노드를 가질 수 있어 디스크 접근이 적은 것이 특징입니다. BST/AVL은 메모리 기반이고, B-Tree는 블록 기반 대용량 데이터에 적합하여 DB나 파일 시스템에서 주로 사용됩니다.
심화 질문: B-Tree가 메모리보다 디스크 기반에 적합한 이유는?
답변: B-Tree는 한 노드에 많은 데이터를 저장해 디스크 접근 횟수를 줄이므로 I/O 비용이 적습니다. 이로 인해 블록 기반 저장 구조에 유리합니다.
✅ 14. Trie(트라이) 자료구조
Q. Trie 자료구조는 어떤 용도에 적합한가요?
답변: Trie는 문자열 집합을 트리 형태로 저장하는 자료구조로, 문자열 검색, 자동완성, 접두사 검색에 유리합니다. 각 노드는 문자의 한 글자를 표현하며, 검색 시간은 문자열 길이에 비례합니다.
심화 질문: Trie가 일반 해시맵보다 나은 상황은?
답변: 접두사 기반 검색이나 공통 접두어 그룹화가 필요한 경우, 해시맵보다 효율적입니다. 또한 키 충돌이 없고, 정렬된 순서로 탐색도 가능합니다.
✅ 15. 상태 머신 구조 (FSM)
Q. 게임 클라이언트에서 FSM(Finite State Machine)은 왜 중요한가요?
답변: FSM은 객체(플레이어, AI 등)의 상태와 전이 조건을 명확히 표현해주는 구조입니다. 상태 기반 애니메이션, AI 행동, UI 전환 등에서 사용되며, 관리가 쉽고 확장성도 좋습니다.
심화 질문: FSM을 클래스 구조로 설계하면 어떤 장점이 있나요?
답변: 각 상태를 클래스로 분리하면 SRP(단일 책임 원칙)를 만족시켜 유지보수가 용이하며, 상태 간 전이 로직도 명확하게 분리할 수 있습니다.
✅ 16. ECS (Entity-Component-System) 구조
Q. ECS(Entity Component System) 구조는 기존 OOP와 어떻게 다른가요?
답변: ECS는 데이터 중심 설계 방식으로, Entity는 ID만 가지며, Component는 데이터, System은 로직을 분리합니다. 이는 메모리 정렬, 캐시 효율 향상에 유리하며, 대규모 객체 처리에 강력합니다. Unity DOTS가 대표적인 예입니다.
심화 질문: Unity ECS와 기존 MonoBehaviour 기반 구조의 차이는?
답변: MonoBehaviour는 상속 구조로 설계되어 있고 GC 영향을 많이 받습니다. 반면 Unity ECS는 구조체 기반으로, Burst Compiler와 함께 사용 시 GC가 없고 성능 최적화에 매우 유리합니다.
✅ 17. 멀티스레딩 자료구조 (Lock-Free Queue 등)
Q. Lock-Free Queue는 왜 필요한가요?
답변: 멀티스레드 환경에서 데이터 충돌 없이 병렬 처리를 가능하게 하기 위해 사용됩니다. 락을 사용하지 않기 때문에 병목 현상이 줄고 성능이 향상됩니다. 주로 네트워크 수신 버퍼, 게임 이벤트 큐 등 실시간성이 중요한 곳에서 사용됩니다.
심화 질문: Compare-And-Swap(CAS)은 어떤 상황에서 사용되나요?
답변: CAS는 원자적으로 메모리 값을 비교 후 변경할 수 있도록 해주는 CPU 명령어로, Lock-Free 자료구조 구현 시 핵심적으로 사용됩니다.
✅ 18. 메모리 풀 / 객체 풀 (Object Pooling)
Q. Object Pooling은 언제 사용하는 것이 좋은가요?
답변: 생성/파괴가 빈번한 객체(예: 총알, 이펙트 등)를 재사용하여 메모리 할당/해제 비용과 GC 부담을 줄이기 위해 사용합니다. Unity에서도 MonoBehaviour의 Instantiate/Destroy 대신 풀링 구조가 성능상 유리합니다.
심화 질문: 풀에 보관된 객체 상태를 어떻게 초기화/관리하나요?
답변: 반환 시 초기화 함수를 호출하여 상태를 재설정하고, 재사용 전에 항상 검증하는 구조로 구현합니다.
✅ 19. Custom Allocator (커스텀 메모리 할당기)
Q. Custom Allocator를 사용하는 이유는 무엇인가요?
답변: 메모리 할당 패턴이 반복되거나 실시간 처리 성능이 중요한 경우, 메모리 파편화와 할당 비용을 줄이기 위해 커스텀 할당기를 사용합니다. 게임 클라이언트에서는 템포럴 영역, 프레임별 스크래치 할당 등에 사용됩니다.
심화 질문: Arena Allocator는 어떤 구조인가요?
답변: 고정 크기의 메모리 블록을 미리 할당하고, 선형적으로 할당하며, 전체 초기화만으로 해제할 수 있는 구조입니다.
✅ 20. 자료구조 비교 및 선택 기준
다음은 면접에서 자주 묻는 자료구조 간 비교와 사용 시점입니다.
자료구조 사용 시점 시간 복잡도 (평균) 장점 단점
| Array / List | 인덱스 접근, 캐시 효율 중요 | 접근 O(1), 삽입/삭제 O(n) | 빠른 접근, 캐시 친화 | 삽입/삭제 비용 큼 |
| LinkedList | 중간 삽입/삭제 자주 | 접근 O(n), 삽입 O(1) | 삽입/삭제 유리 | 캐시 미스 많음 |
| Stack / Queue | 순차 처리 필요 | 접근 O(1), 삽입 O(1) | 간단한 구조, 빠름 | 임의 접근 불가 |
| HashMap / Dictionary | 키-값 빠른 조회 | 접근/삽입 O(1) | 매우 빠름 | 충돌/순서 없음 |
| TreeMap (map) | 정렬된 키 필요 | 접근/삽입 O(log n) | 순서 보장 | 느림 |
| Priority Queue (Heap) | 우선순위 처리 | 삽입/삭제 O(log n) | 항상 top 접근 가능 | 구현 복잡 |
| Trie | 문자열 검색, 자동완성 | 삽입/검색 O(L) | 접두사 검색 특화 | 메모리 사용 큼 |
| Graph | 경로 탐색, 연결 구조 | DFS/BFS O(V+E) | 유연한 구조 | 복잡도 있음 |
| Spatial Hash | 공간 분할 탐색 | O(1~k) | 넓은 공간 효율적 | 해시 설계 중요 |
| QuadTree / KDTree | 충돌 감지, 범위 탐색 | O(log n) | 탐색 최적화 | 구현 난이도 있음 |
| Ring Buffer | 고정된 순환 버퍼 | 접근 O(1) | GC 없음, 빠름 | 크기 제한됨 |
| Object Pool | 빈번한 생성/삭제 | O(1) | 메모리 절약 | 상태 관리 필요 |
※ O(L): 문자열 길이, V: 정점 수, E: 간선 수
✅ 자료구조 선택 가이드
- 빠른 검색 필요: HashMap / Dictionary
- 정렬된 데이터 필요: TreeMap / map / set
- 범위 질의, 공간 탐색: Quadtree, KDTree, Spatial Hash
- 문자열 처리: Trie
- 실시간 처리, 메모리 재사용: Ring Buffer, Object Pool
- 우선순위 처리가 중요: Heap / Priority Queue
- GC 없는 구조 원할 때: C++ STL, Unity NativeArray, Custom Allocator
'면접 준비' 카테고리의 다른 글
| [면접 준비] 컴퓨터 사이언스 및 공통 질문 정리 (0) | 2025.08.25 |
|---|---|
| [면접 준비] 게임 클라이언트 그래픽스 면접 질문 정리 (0) | 2025.08.25 |
| [면접 준비] 운영체제 항목 정리 (0) | 2025.08.05 |
| [면접 준비] 네트워크 항목 정리 (0) | 2025.08.05 |
| [면접 준비] C# 항목 정리 (0) | 2025.08.05 |