딕셔너리 (Dictionary)
딕셔너리는 .NET에서 제공하는 Key, Value 기반의 자료 구조다.
- Key : 검색을 위한 열쇠 역할. 중복 불가.
- Value : 해당 Key와 매핑된 실제 값. 단순한 값이기에 중복 가능.
JS의 json 방식의 오브젝트 데이터가 생각나는 형태다.
게임에서 아이템 관리, 캐릭터 관리, 스킬 단축키, 경험치 테이블 등 다양한 곳에 활용될 수 있다.
간혹 코딩테스트에서도 활용되는 모습이 보이는데 어떨 때 사용하면 좋을지 지속적으로 고민해볼 필요가 있을 거 같다.
기본적인 사용법은 다음과 같다.
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
Dictionary<string, int> itemAmount = new Dictionary<string, int>();
// 추가
itemAmount.Add("파괴폭탄", 12);
itemAmount.Add("회오리수류탄", 18);
itemAmount.Add("성부", 22);
// Key로 Value 조회
Console.WriteLine(itemAmount["파괴폭탄"]); // 12
// 수정 (덮어쓰기)
itemAmount["파괴폭탄"] = 99;
// 조회
Console.WriteLine(itemAmount["파괴폭탄"]); // 99
}
}
System.Collections.Generic을 불러와야 사용 가능한 것을 볼 수 있다.
System.Collections에 있는 해시브라운..이 아니라 해시테이블의 보완 및 강화 형태의 자료 구조라고 볼 수 있다.
주요 메서드
Add(Key, Value) : 새로운 키,값 쌍을 추가한다. 이미 존재하는 키라면 예외 발생.
dic.Add("Sword", 1);
ContainsKey(Key) : 특정 키가 있는지 확인한다.
if(dic.ContainsKey("Potion")) { ... }
ContainsValue(Value) : 특정 값이 있는지 확인한다.
if(dic.ContainsValue(10)) { ... }
Remove(Key) : 특정 키를 삭제한다.
dic.Remove("Bow");
Clear : 모든 요소를 삭제한다.
dic.Clear()
Count(Property) : 저장된 요소의 개수를 반환한다.
Console.WriteLine(dic.Count);
Keys,Values (Property) : 각각 모든 Key, Value 컬렉션을 반환한다.
foreach(var key in dic.Keys) Console.WriteLine(key);
foreach(var val in dic.Values) Console.WriteLine(val);
TryGetValue(Key, out Value) : 안전하게 값 가져오기. 키가 없으면 false 반환. TryParse와 비슷하다.
if(dic.TryGetValue("Shield", out int value))
Console.WriteLine(value);
ElementAt(i) : LINQ 필요. 인덱스로 접근하는 편법. 그러나 딕셔너리는 순서를 보장하지 않으므로 주의해야한다.
(C# 6.0 이후로는 삽입 순서 유지가 기본 동작이라고 한다. 다만, 사양에 의해 보장된 것은 아니므로 순서 의존 로직은 피할 것을 권장하는 정도인 듯 하다.)
using System;
using System.Collections.Generic;
using System.Linq; // ElementAt을 쓰려면 필요
class Program
{
static void Main()
{
Dictionary<string, int> dic = new Dictionary<string, int>();
dic.Add("Key1", 100);
dic.Add("Key2", 200);
dic.Add("Key3", 300);
for (int i = 0; i < dic.Count; i++)
{
var pair = dic.ElementAt(i);
Console.WriteLine($"[{i}] {pair.Key} : {pair.Value}");
}
}
}
연관
List와 비교 표
| List | Dictionary | |
| 접근 방법 | 인덱스 (0,1,2,…) | Key |
| 탐색 속도 | O(n) | 평균 O(1) |
| Key 중복 | 없음 | 없음 |
| Value 중복 | 가능 | 가능 |
| 대표 사용처 | 순차적 데이터 | 빠른 검색, 매핑 |
ArrayList, Hashtable과의 관계
- ArrayList, Hashtable 은 구버전 .NET의 비제네릭 컬렉션이다.
- ArrayList → List<T> 로 대체됨.
- Hashtable → Dictionary<TKey, TValue> 로 대체됨.
- 이유: ArrayList와 Hashtable은 모든 데이터를 object로 관리하므로 Boxing/Unboxing 비용이 크고, 타입 안정성이 보장되지 않는다.
해시 테이블 (Hash Table)
- Dictionary는 내부적으로 해시 테이블 구조를 사용한다.
- Key를 해시 함수(Hash Function)로 변환 → 배열 인덱스로 매핑 → Value를 저장.
- 평균 접근 시간은 O(1)로 빠르다.
해시 충돌 (Hash Collision)
- 서로 다른 Key가 같은 해시 값을 가질 수 있다. (충돌)
- Dictionary는 이를 처리하기 위해 체이닝(LinkedList) 나 Open Addressing 기법을 사용한다.
- 개발자가 직접 관리할 필요는 없지만, 내부적으로 이런 구조가 돌아가고 있다는 걸 알아두면 좋다.
핵심 포인트 정리
- Dictionary와 List의 차이?
- List는 인덱스로 접근, Dictionary는 Key로 접근.
- List 검색은 O(n), Dictionary 검색은 평균 O(1).
- Dictionary의 Key와 Value 특성은?
- Key는 중복 불가, Value는 중복 가능.
- Hashtable과의 차이?
- Hashtable은 object 기반 (Boxing/Unboxing 문제).
- Dictionary는 제네릭 기반, 타입 안정성 보장.
- 게임에서의 활용 예시
- 인벤토리, 키보드 입력 매핑, 경험치 테이블, Localization 등.
'C#' 카테고리의 다른 글
| C# - 덱 (Deque : Double Ended Queue) (0) | 2025.09.29 |
|---|---|
| C# - 스택/큐 실습 문제 풀이 (0) | 2025.09.26 |
| C# - 스택 (Stack), 큐 (Queue) (0) | 2025.09.26 |
| C# - BFS (너비 우선 탐색) / DFS (깊이 우선 탐색) (0) | 2025.09.25 |
| C# - 자료구조 실습 - 인벤토리 (0) | 2025.09.25 |