C#에서 Hashtable과 Dictionary의 차이점
C#에서 Hashtable과 Dictionary는 모두 데이터를 저장하는 데 사용되는 대표적인 자료구조입니다. 두 컬렉션의 가장 큰 공통점은 데이터를 키(Key)와 값(Value)의 쌍 형태로 저장한다는 점입니다.
다만 두 자료구조는 타입 안정성, 성능, 예외 처리 방식 등 여러 측면에서 중요한 차이를 보입니다. 아래 표에서 핵심 차이점을 하나씩 비교해 보겠습니다.
| 번호 | 구분 | Hashtable | Dictionary |
|---|---|---|---|
| 1 | 정의 | Hashtable은 키/값 쌍으로 데이터를 저장하는 제네릭이 아닌(non-generic) 컬렉션으로, System.Collections 네임스페이스에 정의되어 있습니다. | Dictionary는 System.Collections.Generic 네임스페이스에 정의된 제네릭(generic) 컬렉션으로, 마찬가지로 키/값 쌍 형태로 데이터를 저장합니다. |
| 2 | 데이터 타입 | Hashtable은 키와 값의 데이터 타입이 서로 달라도 저장할 수 있으며, 타입을 미리 지정할 필요가 없습니다. 어떤 타입의 객체든 자유롭게 저장할 수 있습니다. | Dictionary는 생성 시점에 키와 값의 타입을 반드시 지정해야 하며, 지정된 타입과 일치하는 데이터만 저장할 수 있습니다. |
| 3 | 데이터 검색 속도 | Hashtable은 값을 읽어올 때 박싱(boxing)과 언박싱(unboxing) 과정이 발생하기 때문에 Dictionary에 비해 검색 속도가 느립니다. | Dictionary는 박싱/언박싱이 발생하지 않으므로 데이터 검색 및 조회 속도가 더 빠릅니다. |
| 4 | null 값 처리 | Hashtable에서 존재하지 않는 키에 접근하면 예외가 발생하지 않고 null을 반환합니다. | Dictionary에서 존재하지 않는 키에 접근하면 KeyNotFoundException 예외가 발생합니다. |
| 5 | 데이터 순서 | Hashtable은 삽입된 키/값 데이터의 순서를 유지하지 않습니다. | Dictionary는 저장된 값의 삽입 순서를 유지합니다. |
어떤 것을 선택해야 할까?
일반적으로 현대적인 C# 개발에서는 Dictionary<TKey, TValue> 사용이 권장됩니다. 컴파일 시점에 타입을 검사하므로 타입 안정성이 보장되고, 박싱/언박싱 오버헤드가 없어 성능 면에서도 유리하기 때문입니다.
반면 레거시 코드와의 호환이 필요하거나, 서로 다른 타입의 데이터를 하나의 컬렉션에 유연하게 담아야 하는 특수한 상황에서는 Hashtable이 여전히 유용할 수 있습니다.