프로그래밍/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에 일정한 형식이 없고 여러 형태를 저장하려면
해시테이블을 사용해야합니다.