🐶🦶을 하다보면 Key - Value를 사용하여 자료를 저장해야 하는 경우가 종종 있다.
C#에서 제공되는 타입은 2가지가 있는데 Hashtable과 Dictionary이다.
이 두가지 타입의 사용법과 장단점에 대해 알아보자!
Hashtable
Hashtable의 경우 Non-Generic 타입으로 Key와 Value 모두 Object를 입력 받는다.
Non-Generic 타입이므로 Boxing과 UnBoxing이 일어난다.
즉, Generic을 이용하지 않고 Object를 사용하기 때문에 모든 데이터 타입을 다 받고 처리할 수 있는 장점이 있지만, 자료 입력에 내부적으로 Boxing이 일어나고 사용하는 곳에서 다시 UnBoxing을 해줘야 사용이 가능하다.
Hashtable ht = new Hashtable();
// Boxing
ht.Add("data1", new ExClass() {data = "test1"});
ht.Add("data2", new ExClass() {data = "test2"});
if (ht.ContainsKey("data1").Equals(true))
{
ExClass ec = ht["data1"] as ExClass; // UnBoxing
Console.WriteLine(ec.data);
}
// Output
// test1
※ 잠깐! Boxing과 UnBoxing이 뭔데?? 🙋♂️ → https://dev-jy.tistory.com/58
Dictionary
Dictionary의 경우 Generic 타입으로 Key와 Value 모두 선언 시 타입을 입력해줘야 한다.
따라서, Boxing과 UnBoxing이 일어나지 않는다.
즉, 다른 곳에서 이 타입을 사용할 때도 타입이 정의되어 있으니 다른 타입으로 형변환을 시도하다가 실패할 염려가 없다.
그래서?
Hashtable은 여러 타입을 수용할 수 있다는 장점이 있고, Dictionary는 Boxing과 UnBoxing이 일어나지 않기 때문에 속도가 빠르다는 장점이 있다. 위의 Boxing과 UnBoxing 링크에 설명해 놓은 것 처럼 Boxing은 단순 참조 할당에 20배, Unboxing은 할당의 4배에 달하는 시간이 소요된다고 한다.
사실 개발하다보면 한 컨테이너에 여러 타입을 수용해야할 일이 많이 없다는 생각이 든다. 따라서 성능적인 측면에서는 Dictionary의 사용이 유리할 것으로 보인다.
'🪟C# | .NET' 카테고리의 다른 글
[C#] Boxing & UnBoxing (박싱과 언박싱) (0) | 2022.09.14 |
---|