Dictionary<T>

Clean·2025년 3월 31일

딕셔너리 (Dictionary)

  • Dictionary은 Hash Table 기반의 Key - Value 쌍으로 데이터를 저장하는 자료구조다.

key로 바로 value에 바로 접근할 수 있으며 삽입, 삭제가 빠르다.

* 접근, 삽입, 삭제 O(1)

글보다는 예시 코드로 알아보자.


문법

// 초기화
Dictionary<int, string> table = new Dictionary<int, string>();

< key, value > 키와 값 타입을 명시적으로 지정해줘야 한다.


추가

table.Add(key, value);
table.TryAdd(key, value);
table[key] = value;

삭제

table.Remove(key);

탐색

table.ContainsKey(key);
table.ContainsValue(value);
table.TryGetValue(key, out value);

예시

struct CardStruct
{
	public int id;
	public string name;
	public Action actionEffect;
}

static void Main()
{
	Dictionary<int, CardStruct> cardData = new Dictionary<int, CardStruct>();
    cardData[1] = new CardStruct
    {
    	id = 1,
    	name = "카드1",
    	actionEffect = () => Console.WriteLine("카드1 사용")
    };
    
    cardData.Add(2, new CardStruct
    {
    	id = 2,
        name = "카드2",
        actionEffect = () => Console.WriteLine("카드2 사용")
    });
}

int 타입 키의 struct 타입의 값으로 딕셔너리를 초기화했다.

안에 값들은 id, name, actionEffect를 넣었는데, idnameint, string타입이고

actionEffect를 통해 미리 만들어 둔 함수를 실행할 수도 있다.


딕셔너리에 저장한 함수 사용

// TryGetValue
if (cardData.TryGetValue(1, out CardStruct card)) // (key, out value)
{
	card.actionEffect?.Invoke();
}

// indexer
cardData[2].actionEffect?.Invoke();

딕셔너리에 저장된 값에 접근하는 방법이 몇가지가 있다.

  1. TryGetValue를 사용해서 함수를 실행

  2. [indexer]로 접근해서 함수를 실행

지금은 예시로 Action<> 타입을 사용했지만,

인수를 넣어 Func<> 를 사용한다면 좀 더 활용해볼 수 있을 것 같다.


반복문

딕셔너리도 반복문을 통해 저장된 키, 값들을 알 수 있다.

// 딕셔너리 foreach
foreach (var item in cardData)
{
    Console.Write("Key : ");
    Console.WriteLine(item.Key);		// 키 값 (int)
    Console.Write("Value : ");
    Console.WriteLine(item.Value.id);	// 필드 값 (struct)
    Console.WriteLine(item.Value.name);
	item.Value.actionEffect.Invoke();
    Console.WriteLine();
}

다만 for문을 사용하기엔 까다로워서 foreach가 사용하기 편하다.


주의점

딕셔너리는 앞서 말했다시피 접근, 삽입, 삭제의 시간 복잡도는 O(1)이다.

그렇다고 해서 데이터 삽입과 삭제를 자주 사용하다보면,

공간 사용량이 높아져서 해시 테이블의 특성에 따라 리해싱이 이루어져 느려질 수 있다.


keyint뿐이였던 array, list들과 달리 여러 타입의 key를 사용할 수 있어서,

Class, Interface와 같이 게임을 제작할때 아주 유용하게 사용할 수 있을 것 같다.

0개의 댓글