C#에서 Hashtable은 Dictionary보다 속도가 느립니다. 강력한 형식(strongly-typed) 컬렉션이 필요하다면 Dictionary를 사용하는 것이 성능 면에서 훨씬 유리합니다. 두 클래스 모두 키(Key)와 값(Value) 쌍을 저장하지만, 내부 동작 방식과 형식 안정성에서 중요한 차이가 있습니다.
Hashtable이란?
Hashtable 클래스는 키의 해시 코드(hash code)를 기반으로 구성된 키-값 쌍의 컬렉션을 나타냅니다. 컬렉션 내 요소에 접근할 때는 키를 사용하며, System.Collections 네임스페이스에 포함되어 있습니다.
Hashtable은 키와 값을 모두 object 타입으로 저장하기 때문에 값 형식(value type)을 사용할 경우 박싱(boxing)과 언백싱(unboxing)이 발생하여 성능 저하가 일어날 수 있습니다.
Hashtable 예제
using System;
using System.Collections;
namespace Demo {
class Program {
static void Main(string[] args) {
Hashtable ht = new Hashtable();
ht.Add("E001", "Tom");
ht.Add("E098", "Amit");
ht.Add("E110", "Jack");
ICollection key = ht.Keys;
foreach (string k in key) {
Console.WriteLine(k + ": " + ht[k]);
}
Console.ReadKey();
}
}
}실행 결과
E001: Tom E098: Amit E110: Jack
Dictionary란?
Dictionary는 C#에서 키와 값으로 이루어진 제네릭(Generic) 컬렉션입니다. Dictionary<TKey, TValue>는 System.Collections.Generic 네임스페이스에 포함되어 있으며, 키와 값의 자료형을 컴파일 시점에 지정할 수 있습니다.
형식을 미리 지정하기 때문에 잘못된 타입의 데이터가 들어오는 것을 컴파일 단계에서 방지할 수 있고, 박싱/언백싱 오버헤드가 없어 Hashtable보다 빠른 조회 성능을 제공합니다.
Dictionary 예제
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
IDictionary<int, int> dict = new Dictionary<int, int>();
dict.Add(1, 234);
dict.Add(2, 489);
dict.Add(3, 599);
dict.Add(4, 798);
dict.Add(5, 810);
dict.Add(6, 897);
dict.Add(7, 909);
Console.WriteLine("Dictionary elements: " + dict.Count);
}
}실행 결과
Dictionary elements: 7
핵심 차이점 비교
- 형식 안정성: Dictionary는 제네릭으로 컴파일 타임에 타입을 검사하지만, Hashtable은 object 타입을 사용해 런타임 오류 가능성이 있습니다.
- 성능: Dictionary는 박싱/언백싱이 없어 값 형식 처리 시 Hashtable보다 빠릅니다.
- 네임스페이스: Hashtable은
System.Collections, Dictionary는System.Collections.Generic에 속합니다. - null 허용 여부: Hashtable은 값과 키 모두 null을 허용하지만, Dictionary는 null 키를 허용하지 않습니다(참조 형식의 값은 null 허용).
결론적으로, 새로운 프로젝트에서는 형식 안전성과 성능이 뛰어난 Dictionary<TKey, TValue>를 사용하는 것이 권장됩니다. Hashtable은 주로 레거시 코드와의 호환성이 필요한 경우에만 고려하는 것이 좋습니다.