Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# HybridDictionary 클래스란? 주요 속성·메서드와 실전 예제 총정리

HybridDictionary 클래스란?

C#의 HybridDictionary 클래스는 IDictionary 인터페이스를 구현한 컬렉션으로, 저장된 데이터가 적을 때는 내부적으로 ListDictionary를 사용하다가, 컬렉션의 크기가 일정 수준 이상으로 커지면 자동으로 Hashtable로 전환하는 하이브리드 방식으로 동작합니다.

이 덕분에 소량의 데이터를 다룰 때는 ListDictionary 특유의 빠른 성능을 유지하고, 데이터가 많아졌을 때도 Hashtable의 효율적인 검색 성능을 그대로 누릴 수 있습니다. 따라서 컬렉션의 최종 크기를 미리 알기 어려운 상황에서 매우 유용하게 활용됩니다.

HybridDictionary 클래스의 주요 속성

HybridDictionary 클래스에서 자주 사용되는 속성은 다음과 같습니다.

번호속성 및 설명
1Count
HybridDictionary에 포함된 키/값 쌍의 개수를 반환합니다.
2IsFixedSize
HybridDictionary의 크기가 고정되어 있는지 여부를 나타내는 값을 반환합니다.
3IsReadOnly
HybridDictionary가 읽기 전용인지 여부를 나타내는 값을 반환합니다.
4IsSynchronized
HybridDictionary가 동기화(스레드 세이프)되어 있는지 여부를 나타내는 값을 반환합니다.
5Item[Object]
지정된 키와 연결된 값을 가져오거나 설정합니다.
6Keys
HybridDictionary의 모든 키를 담고 있는 ICollection을 반환합니다.
7SyncRoot
HybridDictionary에 대한 접근을 동기화하는 데 사용할 수 있는 객체를 반환합니다.
8Values
HybridDictionary의 모든 값을 담고 있는 ICollection을 반환합니다.

HybridDictionary 클래스의 주요 메서드

번호메서드 및 설명
1Add(Object, Object)
지정된 키와 값으로 이루어진 항목을 HybridDictionary에 추가합니다.
2Clear()
HybridDictionary에서 모든 항목을 제거합니다.
3Contains(Object)
HybridDictionary에 특정 키가 포함되어 있는지 여부를 판단합니다.
4CopyTo(Array, Int32)
지정한 인덱스 위치부터 HybridDictionary의 항목들을 1차원 Array 인스턴스에 복사합니다.
5Equals(Object)
지정된 객체가 현재 객체와 같은지 여부를 판단합니다.
(Object에서 상속)
6GetEnumerator()
HybridDictionary를 순회(iterate)할 수 있는 IDictionaryEnumerator를 반환합니다.
7GetHashCode()
기본 해시 함수 역할을 수행합니다.
(Object에서 상속)
8GetType()
현재 인스턴스의 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 등을 활용한 별도의 동기화 처리가 필요하다는 점을 기억해 두시기 바랍니다.