프로그래밍/C#

[C#] 해시테이블 vs 딕셔너리 ( hashtable vs. dictionary )

건앤로즈 2015. 3. 25. 18:45

C#에서는 KEY 와 VALUE를 사용해서 자료를 저장하는 타입이 2가지가 있습니다.

해시테이블과 딕셔너리인데 사용법은 거의 동일하지만 내부적으로 처리하는 기술이 다릅니다.

이 두가지 타입의 기본적인 사용법과 장단점에 대해서 알아보겠습니다.


1.해시테이블 ( Hashtable)


//생성
Hashtable hashtable = new Hashtable();

//자료 추가 ( 박싱이 일어남)
hashtable.Add("Data1", new HongsClass() { Name = "홍진현1", intCount = 1 });
hashtable.Add("Data2", new HongsClass() { Name = "홍진현2", intCount = 2 });

//자료 검색
if (hashtable.ContainsKey("Data1").Equals(true))
{
    HongsClass temp = hashtable["Data1"] as HongsClass; (언박싱 처리)
    Console.WriteLine(temp.Name);
}

//Loop 전체 순회출력
foreach (string NowKey in hashtable.Keys)
{
    HongsClass temp = hashtable[NowKey] as HongsClass;
    Console.WriteLine(temp.Name);
        
}

//결과  OUTPUT
//홍진현1
//홍진현1
//홍진현2


[해시테이블의 특징]


1.Non-Generic

2.Key 와 Value 모두 Object를 입력받는다.

3.박싱/언박싱(Boxing/Un-Boxing) (참고: http://hongjinhyeon.tistory.com/90을 사용한다. 



즉, 제네릭을 이용하지 않고 Object를 사용하기 때문에 모든 데이터 타입을 다 받고 처리 할 수 있는 장점이 있지만

자료의 입력에 내부적으로 박싱이 일어나고 사용하는 곳에서도 다시 언박싱을 해줘야 사용이 가능합니다.



2.딕셔너리 ( Dictionary )


//생성- 제네릭 기반 
Dictionary<string, HongsClass> dictionary = new Dictionary<string, HongsClass>();

//자료추가
dictionary.Add("Data1", new HongsClass() { Name = "홍진현1", intCount = 1 });
dictionary.Add("Data2", new HongsClass() { Name = "홍진현2", intCount = 2 });

//자료검색
if (dictionary.ContainsKey("Data1").Equals(true))
{
    Console.WriteLine(dictionary["Data1"].Name);
}

//Loop 전체 순회출력
foreach (HongsClass NowData in dictionary.Values)
{
    Console.WriteLine(NowData.Name);
}

//결과
//홍진현1
//홍진현1
//홍진현2


[딕셔너리의 특징]

1.Generic
2.Key와 Value 모두 Strong Type을 입력받는다.(선언시 타입을 입력해줘야함)

3.박싱/언박싱이 일어나지 않는다.



+딕셔너리는 선언시에 사용할 타입을 미리 설정하기 때문에 입력시나 출력시에도 박싱/언박싱이 일어나지 않습니다.

따라서 입력과 사용에 용이하며, 외부에서도 이 타입을 사용할 때도 타입이 정의되어 있으니 다른 타입으로 형변환을

시도하다가 실패할 염려가 없습니다.



3.결론


+두가지 타입이 사용법은 비슷하지만 내부적인 처리와 수용하는 타입의 형태가 다르므로 필요에 따라서 선택을 해야합니다.

고정적으로 하나의 타입만 입력받을 시에는 딕셔너리를 사용하며, Value에 일정한 형식이 없고 여러 형태를 저장하려면

해시테이블을 사용해야합니다.