초고교급 희망

[C#] Dictionary <TKey, TValue> 클래스 본문

Game/C#

[C#] Dictionary <TKey, TValue> 클래스

연모링 2022. 7. 20. 15:44
728x90

 

Dictionary란 무엇인가

 

기본 구조는 Dictionary <TKey, TValue> 형태고

말 그대로 사전처럼 key 값에 value를 저장해서 나중에 찾아보기 쉽게 저장하는 자료형이다.

 

클래스가 해시 테이블로 구현되기 때문에 Dictionary<TKey,TValue> 키를 사용하여 값을 검색하는 것은 매우 빠르며 O(1)에 가깝다.

검색 속도는 지정된 형식 TKey의 해시 알고리즘 품질에 따라 달라진다.

 

그럼 간단하게 포켓몬 도감을 만들어보겠습니다.

이상해씨
이상해꽃(좌측)과 메가이상해꽃(우측)

 

//선언
Dictionary<int, string> pokemon = new Dictionary<int, string>();

//딕셔너리에 요소 추가.
//key 값은 중복될 수 없다. 하지만 value는 중복 가능하다.
//당연함 key를 인덱스로 내용물을 저장함
pokemon.Add(1,"이상해씨");
pokemon.Add(2,"이상해풀");
pokemon.Add(3,"이상해꽃");

//새 key가 이미 존재하는 값이면 Add 매소드는 throw ArgumentException 된다
try
{
    pokemon.Add(3, "메가이상해꽃");
}
catch (ArgumentException)
{
    Console.WriteLine("An element with Key = \"3\" already exists.");
}

//Item 속성은 인덱서의 다른 이름이므로 요소에 액세스할 때 해당 이름을 생략할 수 있다.
Console.WriteLine(pokemon[1]); //이렇게 출력하면 이상해씨가 나온다.
Console.WriteLine(pokemon[3]); //이상해꽃이 나온다.

//인덱서를 사용하여 키와 연결된 값을 변경할 수 있다.
pokemon[3] = "메가이상해꽃";
Console.WriteLine(pokemon[3]); //이제 메가이상해꽃이 나온다.

//키가 없는 경우 해당 키에 대한 인덱서를 설정하면 새 키/값 쌍이 추가된다.
pokemon[4] = "파이리"; //Add로 추가한 것처럼 파이리가 추가된다.

//요청한 키가 dictionary에 없으면 인덱서가 exception을 발생시킨다.
//100번째 포켓몬이 없어서 catch가 실행된다.(당연함)
try
{
	Console.WriteLine(pokemon[100]);
}
catch (KeyNotFoundException)
{
	Console.WriteLine("Key is not found.");
}

//프로그램이 자주 Dictionary에 없는 키를 시도해야 할 때, 
//TryGetValue는 값을 검색하는 보다 효율적인 방법이다.
//out 키워드를 반드시 사용해야하고, 원하는 값을 그쪽으로 리턴시킬 수 있다.
string value = "";
if (pokemon.TryGetValue(100, out value))
{
	Console.WriteLine(value);
}
else
{
	Console.WriteLine("Key is not found."); //100번째가 없으니 여기가 출력됨
}

if (pokemon.TryGetValue(1, out value))
{
	Console.WriteLine(value);
    //value로 해당 값이 리턴된다. 이상해씨가 출력됨
}
else
{
	Console.WriteLine("Key is not found.");
}

//ContainsKey를 사용하여 키를 삽입하기 전에 테스트할 수 있다.
//ContainsKey는 원하는 값의 존재여부를 확인하기 위해 사용하며 Bool 형태로 결과를 반환한다.
//값이 있으면 true, 없으면 false
if (!pokemon.ContainsKey(5))
{
	pokemon.Add(5, "리자드");
	Console.WriteLine("Value added for key = \"5\": {0}", pokemon[5]);
}

//key값과 value값 각각을 얻고 싶을 때는 KeyValuePair 구조체를 사용한다.
foreach (KeyValuePair<int, string> kvp in pokemon)
{
	Console.WriteLine("{0},{1} ", kvp.Key, kvp.Value);
}

//value값만 얻고 싶을 때
Dictionary<int, string>.ValueCollection valueColl = pokemon.Values;
foreach (string s in valueColl)
{
	Console.WriteLine("Value = {0}", s);
}

//key값만 얻고 싶을 때
Dictionary<int, string>.KeyCollection keyColl = pokemon.Keys;
foreach (int i in keyColl)
{
	Console.WriteLine("Key = {0}", i);
}

//Remove 메서드를 사용하여 key/value 쌍을 제거한다.
pokemon.Remove(5); //5번 리자드 삭제

if (!pokemon.ContainsKey(5))
{
	Console.WriteLine("Key 5 is not found.");
}

 

실행결과

이렇게 공식 라이브러리의 예제를 통해 간단하게 Dictionary를 알아보았습니다.

 

출처: https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.generic.dictionary-2?view=net-6.0

 

728x90

'Game > C#' 카테고리의 다른 글

[C#] Partial 클래스  (0) 2023.07.15
[C#] this 연산자  (0) 2022.07.22
[C#] 접근 제한자  (0) 2022.07.22