HybridDictionary 클래스란?
C#의 HybridDictionary 클래스는 IDictionary 인터페이스를 구현한 컬렉션으로, 저장된 데이터가 적을 때는 내부적으로 ListDictionary를 사용하다가, 컬렉션의 크기가 일정 수준 이상으로 커지면 자동으로 Hashtable로 전환하는 하이브리드 방식으로 동작합니다.
이 덕분에 소량의 데이터를 다룰 때는 ListDictionary 특유의 빠른 성능을 유지하고, 데이터가 많아졌을 때도 Hashtable의 효율적인 검색 성능을 그대로 누릴 수 있습니다. 따라서 컬렉션의 최종 크기를 미리 알기 어려운 상황에서 매우 유용하게 활용됩니다.
HybridDictionary 클래스의 주요 속성
HybridDictionary 클래스에서 자주 사용되는 속성은 다음과 같습니다.
| 번호 | 속성 및 설명 |
|---|---|
| 1 | Count HybridDictionary에 포함된 키/값 쌍의 개수를 반환합니다. |
| 2 | IsFixedSize HybridDictionary의 크기가 고정되어 있는지 여부를 나타내는 값을 반환합니다. |
| 3 | IsReadOnly HybridDictionary가 읽기 전용인지 여부를 나타내는 값을 반환합니다. |
| 4 | IsSynchronized HybridDictionary가 동기화(스레드 세이프)되어 있는지 여부를 나타내는 값을 반환합니다. |
| 5 | Item[Object] 지정된 키와 연결된 값을 가져오거나 설정합니다. |
| 6 | Keys HybridDictionary의 모든 키를 담고 있는 ICollection을 반환합니다. |
| 7 | SyncRoot HybridDictionary에 대한 접근을 동기화하는 데 사용할 수 있는 객체를 반환합니다. |
| 8 | Values HybridDictionary의 모든 값을 담고 있는 ICollection을 반환합니다. |
HybridDictionary 클래스의 주요 메서드
| 번호 | 메서드 및 설명 |
|---|---|
| 1 | Add(Object, Object) 지정된 키와 값으로 이루어진 항목을 HybridDictionary에 추가합니다. |
| 2 | Clear() HybridDictionary에서 모든 항목을 제거합니다. |
| 3 | Contains(Object) HybridDictionary에 특정 키가 포함되어 있는지 여부를 판단합니다. |
| 4 | CopyTo(Array, Int32) 지정한 인덱스 위치부터 HybridDictionary의 항목들을 1차원 Array 인스턴스에 복사합니다. |
| 5 | Equals(Object) 지정된 객체가 현재 객체와 같은지 여부를 판단합니다. (Object에서 상속) |
| 6 | GetEnumerator() HybridDictionary를 순회(iterate)할 수 있는 IDictionaryEnumerator를 반환합니다. |
| 7 | GetHashCode() 기본 해시 함수 역할을 수행합니다. (Object에서 상속) |
| 8 | GetType() 현재 인스턴스의 Type을 반환합니다. (Object에서 상속) |
예제 1: 키/값 쌍 개수 세기
다음은 HybridDictionary에 포함된 키/값 쌍의 개수를 확인하는 예제입니다.
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
public static void Main() {
HybridDictionary dict1 = new HybridDictionary();
dict1.Add("A", "SUV");
dict1.Add("B", "MUV");
dict1.Add("C", "AUV");
Console.WriteLine("HybridDictionary1 요소들...");
foreach(DictionaryEntry d in dict1) {
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("Dictionary1의 키/값 쌍 개수 = " + dict1.Count);
HybridDictionary dict2 = new HybridDictionary();
dict2.Add("1", "One");
dict2.Add("2", "Two");
dict2.Add("3", "Three");
dict2.Add("4", "Four");
dict2.Add("5", "Five");
dict2.Add("6", "Six");
Console.WriteLine("\nHybridDictionary2 요소들...");
foreach(DictionaryEntry d in dict2) {
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("Dictionary2의 키/값 쌍 개수 = " + dict1.Count);
dict2.Clear();
Console.WriteLine("Dictionary2의 키/값 쌍 개수 (갱신 후) = " + dict2.Count);
}
}실행 결과
HybridDictionary1 요소들... A SUV B MUV C AUV Dictionary1의 키/값 쌍 개수 = 3 HybridDictionary2 요소들... 1 One 2 Two 3 Three 4 Four 5 Five 6 Six Dictionary2의 키/값 쌍 개수 = 3 Dictionary2의 키/값 쌍 개수 (갱신 후) = 0
Count 속성을 통해 각 딕셔너리의 항목 수를 확인할 수 있으며, Clear() 메서드 호출 후에는 개수가 0으로 변경된 것을 볼 수 있습니다.
예제 2: 동기화(Synchronized) 여부 확인하기
다음은 HybridDictionary가 고정 크기인지, 읽기 전용인지, 스레드로부터 안전하게 동기화되어 있는지 확인하는 예제입니다.
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
public static void Main() {
HybridDictionary dict1 = new HybridDictionary();
dict1.Add("A", "Books");
dict1.Add("B", "Electronics");
dict1.Add("C", "Smart Wearables");
dict1.Add("D", "Pet Supplies");
dict1.Add("E", "Clothing");
dict1.Add("F", "Footwear");
Console.WriteLine("HybridDictionary1 요소들...");
foreach(DictionaryEntry d in dict1) {
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("HybridDictionary1은 고정 크기인가? = " + dict1.IsFixedSize);
Console.WriteLine("HybridDictionary1은 읽기 전용인가? = " + dict1.IsReadOnly);
Console.WriteLine("HybridDictionary1은 동기화되었는가? = " + dict1.IsSynchronized);
HybridDictionary dict2 = new HybridDictionary();
dict2.Add("1", "One");
dict2.Add("2", "Two");
dict2.Add("3", "Three");
dict2.Add("4", "Four");
dict2.Add("5", "Five");
dict2.Add("6", "Six");
Console.WriteLine("\nHybridDictionary2 요소들...");
foreach(DictionaryEntry d in dict2) {
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("dict1과 dict2는 같은가? = " + (dict1.Equals(dict2)));
Console.WriteLine("HybridDictionary2는 고정 크기인가? = " + dict2.IsFixedSize);
Console.WriteLine("HybridDictionary2는 읽기 전용인가? = " + dict2.IsReadOnly);
Console.WriteLine("HybridDictionary2는 동기화되었는가? = " + dict2.IsSynchronized);
}
}실행 결과
HybridDictionary1 요소들... A Books B Electronics C Smart Wearables D Pet Supplies E Clothing F Footwear HybridDictionary1은 고정 크기인가? = False HybridDictionary1은 읽기 전용인가? = False HybridDictionary1은 동기화되었는가? = False HybridDictionary2 요소들... 1 One 2 Two 3 Three 4 Four 5 Five 6 Six dict1과 dict2는 같은가? = False HybridDictionary2는 고정 크기인가? = False HybridDictionary2는 읽기 전용인가? = False HybridDictionary2는 동기화되었는가? = False
마무리 정리
HybridDictionary는 ListDictionary와 Hashtable의 장점을 결합한 컬렉션입니다. 데이터가 적을 때와 많을 때 모두 적절한 내부 구조를 자동으로 선택하기 때문에, 컬렉션의 크기를 예측하기 어려운 시나리오에서 효율적인 선택지가 됩니다.
다만 기본적으로 스레드 세이프하지 않으므로(IsSynchronized = False), 멀티스레드 환경에서 사용할 경우 SyncRoot 등을 활용한 별도의 동기화 처리가 필요하다는 점을 기억해 두시기 바랍니다.