질문의 배경:
VB.NET에서 데이터의 연관 저장(키-값) 표준으로는 Dictionary(Of TKey, TValue) 클래스가 흔히 사용됩니다. 전통적인 VB6에서는 Scripting.Dictionary 객체나 Collection 컬렉션을 더 자주 사용하였으며, .NET 초기 버전에서 등장한 Hashtable 타입도 있었습니다. 이러한 구조는 키에 대한 값의 빠른 검색을 가능하게 하며 덜 타입 안전한 접근법을 대체하였습니다.
문제
Dictionary와 Hashtable 간의 비즈니스에 대한 비직관적인 차이점은 존재하지 않는 키 검색 시 발생할 수 있는 오류입니다. 예를 들어, 없는 키에 접근하려고 시도하면 경우에 따라 오류가 발생하고 그렇지 않은 경우도 있습니다. 또한, 타입 안전성과 성능의 차이로 인해 컬렉션 선택이 잘못될 수 있습니다.
해결책
현대 VB.NET 버전에서는 Dictionary(Of TKey, TValue)를 사용하는 것이 최선의 관행으로 여겨지며, 여기서 TKey와 TValue는 엄격히 타입이 지정됩니다:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("apple", 1) dict.Add("banana", 2) If dict.ContainsKey("banana") Then Console.WriteLine(dict("banana")) ' 2가 출력됩니다. End If ' 안전한 값 접근 Dim value As Integer If dict.TryGetValue("cherry", value) Then Console.WriteLine(value) Else Console.WriteLine("해당 키가 없습니다!") End If
주요 특징:
Dictionary에서 제한 없이 Object를 키로 사용할 수 있나요?
정확히는 가능합니다. 그러나 키로 사용되는 클래스에서 GetHashCode 및 Equals 메서드를 올바르게 구현해야 합니다. 그렇지 않으면 충돌과 검색 오류가 발생할 수 있습니다.
dict("foo")를 통해 존재하지 않는 키에 접근하면 어떻게 되나요?
KeyNotFoundException 예외가 발생합니다. 키에 대한 사전 검사를 하지 않으면 (ContainsKey 또는 TryGetValue 사용 없이) 프로그램이 중단됩니다.
Dictionary와 Hashtable이 동일한 순서성을 지원하나요?
아니요. 두 클래스 모두 요소의 추가 순서를 보장하지 않습니다. 순서를 유지하려면 SortedDictionary, OrderedDictionary 또는 기타 구조를 사용해야 합니다.
개발자가 대량의 사용자 데이터를 저장하기 위해 Hashtable을 선택했습니다. 문제를 추적하기 힘든 오류가 발생했습니다 — 동일한 키가 항상 일치하지 않았고, 테스트에서는 Object.ReferenceEquals 오류가 발생했으며 불안정한 키 유형이 사용되었습니다.
장점:
단점:
Dictionary(Of Guid, User)로 전환: 엄격한 타입 지정, TryGetValue 지원, 충돌 오류를 제거하였습니다. 성능이 향상되었습니다.
장점:
단점: