Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# Hashtable vs Dictionary: 차이점과 사용 기준 완벽 정리

C#에서 키-값 쌍 데이터를 다룰 때 가장 많이 비교되는 두 컬렉션이 바로 HashtableDictionary입니다. 두 클래스는 비슷한 용도로 사용되지만, 스레드 안전성, 제네릭 지원 여부, 성능 등에서 중요한 차이가 있습니다. 각각의 특징을 자세히 살펴보겠습니다.


Hashtable이란?

Hashtable은 키(key)를 사용하여 요소에 접근해야 하는 상황에서 활용되는 컬렉션입니다. 해시테이블의 각 항목은 키/값 쌍으로 구성되며, 이 키를 통해 컬렉션 내부의 요소에 접근하게 됩니다.

Hashtable의 주요 특징은 다음과 같습니다.

  • 스레드 안전성: Hashtable의 멤버는 스레드로부터 안전(thread-safe)하므로, 멀티스레드 환경에서 비교적 안전하게 사용할 수 있습니다.
  • null 반환: 존재하지 않는 키를 조회하면 예외를 던지지 않고 null을 반환합니다.
  • 비제네릭 타입: Hashtable은 제네릭(generic) 타입이 아니므로 값 형식을 저장할 때마다 박싱(boxing)언박싱(unboxing)이 발생합니다. 이로 인해 Dictionary에 비해 성능이 떨어집니다.

Hashtable을 선언하는 방법은 다음과 같습니다.

Hashtable ht = new Hashtable();

Dictionary란?

Dictionary<TKey, TValue>는 C#에서 키와 값의 컬렉션을 나타내는 대표적인 자료구조로, System.Collections.Generic 네임스페이스에 포함되어 있습니다.

Dictionary의 주요 특징은 다음과 같습니다.

  • 제네릭 타입: 키와 값의 타입을 명시적으로 지정하므로 타입 안정성(type safety)이 보장됩니다.
  • 예외 발생: 존재하지 않는 키에 접근하려 하면 null이 아닌 KeyNotFoundException 오류가 발생합니다.
  • 뛰어난 성능: 박싱과 언박싱 과정이 전혀 없기 때문에 Hashtable보다 훨씬 빠른 속도를 제공합니다.

Dictionary를 선언하는 방법은 다음과 같습니다.

IDictionary<int, string> d = new Dictionary<int, string>();

Hashtable vs Dictionary 핵심 차이점 비교

구분 Hashtable Dictionary
네임스페이스 System.Collections System.Collections.Generic
제네릭 지원 아니오
스레드 안전성 멤버가 스레드 안전함 스레드 안전하지 않음
없는 키 조회 시 null 반환 KeyNotFoundException 발생
성능 느림 (박싱/언박싱 발생) 빠름 (박싱/언박싱 없음)

정리: 어떤 것을 선택해야 할까?

대부분의 경우 Dictionary를 사용하는 것이 권장됩니다. 타입 안정성과 우수한 성능 덕분에 일반적인 개발 상황에서 더 효율적이기 때문입니다. 반면, 레거시 코드 유지보수나 멀티스레드 환경에서 기본적인 스레드 안전성이 필요한 경우에는 Hashtable이 유용할 수 있습니다. 단, 최신 .NET 환경에서는 ConcurrentDictionary를 사용하는 것이 더 나은 선택입니다.