개요
이번 글에서는 C#에서 Dictionary에 대해 알아보겠습니다. Dictionary<TKey, TValue>는 키(Key)-값(Value) 데이터를 저장하고 관리하는데 가장 효율적인 제네릭 컬렉션 클래스입니다. 키 값은 고유하며, 키를 통해 값을 효율적으로 얻을 수 있습니다.
내부적으로 해시 테이블로 구현되기 때문에 빠른 검색, 추가, 삭제를 지원하지만 하며 시간 복잡도는 O(1)에 가깝습니다.
비슷한 클래스로 HashTable이 있으며, 둘 다 키-쌍 관계로 데이터를 관리하지만 Dictionary는 TKey와 TValue에 데이터 형을 미리 지정하여 사용해서 박싱/언박싱이 일어나지 않습니다.
속성 및 함수
Dictionary 에서 자주 사용되는 속성 및 함수는 아래와 같습니다.
속성 및 함수 | 설명 |
---|---|
Count | Dictionary에 저장된 키-값 쌍의 개수를 반환합니다. |
Keys | Dictionary에 있는 모든 키를 반환합니다. |
Values | Dictionary에 있는 모든 값을 반환합니다. |
Add(TKey key, TValue value) | 지정된 키와 값을 추가합니다. 중복 키가 있으면 예외 발생. |
Remove(TKey key) | 지정된 키와 연결된 키-값 쌍을 제거합니다. 성공 여부를 반환합니다. |
Clear() | 모든 키-값 쌍을 제거합니다. |
ContainsKey(TKey key) | 특정 키가 Dictionary에 존재하는지 확인합니다. |
ContainsValue(TValue value) | 특정 값이 Dictionary에 존재하는지 확인합니다. |
TryGetValue(TKey key, out TValue value) | 키가 존재하면 해당 값을 반환하고, 키가 없으면 기본값을 반환합니다. |
ToArray() (확장 메서드) | 키-값 쌍을 배열 형태로 변환합니다. |
예시
Dictionary를 사용해보도록 하겠습니다. 클래스 이름처럼 사전으로 예시를 들어 보겠습니다. 우선 Dictionary 클래스를 선언해서 사용하는 방법은 아래와 같습니다. 데이터를 추가할 때엔 Add 함수를 사용하면 됩니다.
// 1. Dictionary 생성
Dictionary<string, string> dict = new Dictionary<string, string>();
// 2. 데이터 추가
dict.Add("사과", "Apple");
dict.Add("바나나", "Banana");
dict.Add("체리", "Cherry");
dict.Add("포도", "Grape");
dict.Add("오렌지", "Orange");
dict.Add("복숭아", "Peach");
dict.Add("자두", "Plum");
dict.Add("딸기", "Strawberry");
dict.Add("레몬", "Lemon");
dict.Add("멜론", "Melon");
10개의 한/영 데이터를 추가하였습니다. Dictionary의 모든 데이터를 확인하려면 KeyValuePair 구조체를 사용하시면 됩니다.
foreach (KeyValuePair<string, string> pair in dict)
{
Console.WriteLine($"key: {pair.Key}, value: {pair.Value}");
}
데이터가 몇 개인지 확인하려면 Count 속성을 사용하면 됩니다.
Console.WriteLine($"Dictionary에 저장된 항목 개수: {dict.Count}");
키를 입력하여 그에 맞는 값을 찾으려면 인덱서[]를 사용하면 됩니다. 하지만 없는 키는 인덱서에 사용하면 KeyNotFoundException이 발생합니다.
Console.WriteLine($"딸기는 영어로? : {dict["딸기"]}");
Console.WriteLine($"수박은 영어로? : {dict["수박"]}"); // 수박은 없음. KeyNotFoundException 발생
try-catch를 사용하여 exception을 처리하는 방법도 있지만, ContainsKey 함수를 사용하여 키 존재 유무를 판단하는 방법도 있습니다.
if (dict.ContainsKey("수박"))
Console.WriteLine($"수박은 영어로? : {dict["수박"]}");
else
Console.WriteLine($"수박은 사전에 없는 단어입니다.");
혹은 TryGetValue를 사용해도 됩니다.
if (dict.TryGetValue("수박", out string? value))
Console.WriteLine($"수박은 영어로? : {value}");
else
Console.WriteLine($"수박은 사전에 없는 단어입니다.");
값 존재 유무를 파악하려면 ContainsValue 함수를 사용해도 됩니다.
if (dict.ContainsValue("Apple"))
Console.WriteLine($"Apple 사전에 있는 단어입니다.");
else
Console.WriteLine($"Apple 사전에 없는 단어입니다.");
Dictionary의 모든 키를 가져오기 위해서는 Keys 속성을 사용하면 됩니다.
foreach (string key in dict.Keys)
{
Console.WriteLine(key);
}
Dictionary의 모든 값을 가져오기 위해서는 Values 속성을 사용하면 됩니다.
foreach (string val in dict.Values)
{
Console.WriteLine(val);
}
데이터를 삭제하려면 Remove와 Clear 함수를 사용하면 됩니다. Remove는 특정 키의 데이터를 삭제, Clear은 모든 데이터를 삭제하는 함수입니다.
dict.Remove("딸기");
Console.WriteLine($"딸기 삭제한 후 Count: {dict.Count}");
dict.Clear();
Console.WriteLine($"Clear 이후 Count: {dict.Count}");
github : https://github.com/3001ssw/c_sharp/tree/main/Data_Struct/Dictionary