프로그래밍을 잘하고 싶다면, 자료구조는 선택이 아니라 필수
많은 사람들이 List, Dictionary만 쓰면서 그 내부 동작이나 다른 대안 구조를 잘 모르는 경우가 많다.
특히 게임 개발이나 알고리즘 문제 풀이, 실무 최적화에서 자료구조 선택은 성능과 직결된다.
오늘은 주요 자료구조를 간단히 정리하고, 어떤 상황에서 유용하게 쓰일 수 있는지를 다시 복습해보는 시간을 가져보았다.
1. 배열 (Array)
- 고정된 크기의 연속적인 메모리 공간
- 빠른 인덱스 접근 (
O(1)), 하지만 크기 변경 불가
🎮 활용 예:
- 맵 타일 데이터 (고정된 크기), 색상 팔레트 등
- 성능이 중요한 루프에서 단순 배열이 유리할 때 사용
2. 리스트 (List)
- C#의 동적 배열
- 내부적으로 크기 자동 조절 → 배열 복사 발생 가능
🎮 활용 예:
- 인벤토리 아이템 리스트
- 적군 목록, 퀘스트 목록 등 가변적인 데이터에 적합
3. 연결 리스트 (LinkedList)
- 노드 간 참조로 구성 (next, prev)
- 중간 삽입/삭제는 빠르지만 접근은 느림
🎮 활용 예:
- 순서 변경이 잦은 UI 요소나 이벤트 큐
- Undo/Redo 기록 관리 (양방향 리스트)
4. 스택 (Stack)
- 후입선출 (LIFO) 구조
Push(), Pop() 으로 데이터를 다룸
🎮 활용 예:
- 상태머신 처리 (ex: 상태 push & pop)
- 씬 전환, UI 창 스택, 함수 호출 스택
5. 큐 (Queue), 우선순위 큐
- 선입선출 (FIFO) 구조
Enqueue(), Dequeue() 사용
🎮 활용 예:
- 몬스터 스폰 큐
- 네트워크 패킷 처리
- 유닛 명령 대기열 등
6. 딕셔너리 (Dictionary)
- 해시 테이블 기반 자료구조
- 키 → 해시 → 인덱스 → 값 저장
- 평균
O(1) 접근 속도
🎮 활용 예:
- 오브젝트 이름 → Prefab 참조
- 유저 ID → 상태 정보
- NPC 대사, 스킬 ID → 효과 등
⚠️ 해시 충돌 시 성능 저하 가능성 있음 → 대량 데이터일수록 주의
7. SortedDictionary / SortedList
- 자동 정렬된 상태로 키 저장
- 내부적으로 이진 탐색 트리(레드블랙 트리) 사용
🎮 활용 예:
- 순차적으로 정렬된 데이터를 빠르게 조회하고 싶을 때
- 랭킹 시스템 (정렬된 유저 점수 목록 등)
8. 트리 (Tree)
- 계층 구조 표현에 적합
- 대표적: 이진 탐색 트리, AVL, 레드블랙 트리
🎮 활용 예:
- 스킬 트리, UI 메뉴 구조
- 상태 전이 트리 (FSM), 애니메이션 트리
9. 그래프 (Graph)
- 정점과 간선으로 이루어진 구조
- DFS / BFS / 다익스트라 / A*
🎮 활용 예:
- 길찾기 알고리즘 (네비게이션 메시, A*)
- 소셜 관계망 (플레이어 간 친구 시스템)
- 스테이지 간 연결 구조
10. 힙 (Heap) → 우선순위 큐
- 최소값 또는 최대값을 빠르게 찾는 구조
- 삽입, 삭제 후에도 자동으로 재정렬 유지
🎮 활용 예:
- AI 우선순위 작업 큐 (위험도 높은 유닛 우선 대응)
- 경로 탐색 알고리즘 (A*, 다익스트라)
- 리소스 관리 시스템
🧠 느낀점
- 자료구조는 단순히 외워서 쓰는 게 아니라, 언제 어떤 상황에서 적합한지를 판단
- 특히 게임 개발에서는 구조 하나 잘못 고르면 성능 문제나 유지보수 난이도가 크게 달라진다.
- 앞으로는 알고리즘 문제 풀이뿐만 아니라, 구현 설계 시에도 자료구조를 먼저 고민해야겠다.