본문 바로가기
C#

Dictionary(딕셔너리) 설명과 사용법

by g-builder 2024. 10. 25.

딕셔너리(Dictionary)는 C#에서 매우 유용한 자료구조 중 하나로, 키(Key)와 값(Value) 쌍으로 데이터를 저장하고 관리할 수 있게 해준다. Unity 프로젝트에서 데이터를 효율적으로 관리하고 싶을 때 딕셔너리를 활용하면 많은 도움이 될 수 있다. 

 

딕셔너리는 System.Collections.Generic 네임스페이스에 포함된 제네릭 컬렉션 중 하나로, 키와 값의 쌍으로 데이터를 저장한다. 각 키는 고유(unique)해야 하며, 이를 통해 값에 빠르게 접근할 수 있다. 딕셔너리는 해시 테이블을 기반으로 구현되어 있어 검색, 추가, 삭제 등의 연산이 매우 효율적이다.

주요 특징

  • 키-값 쌍: 각 데이터는 고유한 키와 이에 대응하는 값으로 저장된다.
  • 빠른 검색: 키를 사용하여 값을 빠르게 검색할 수 있다.
  • 유연성: 다양한 타입의 키와 값을 사용할 수 있다.

딕셔너리 사용하기

딕셔너리 선언 및 초기화

딕셔너리를 사용하려면 먼저 using System.Collections.Generic; 네임스페이스를 포함시켜야 한다. 그 다음, Dictionary<TKey, TValue> 클래스를 사용하여 딕셔너리를 선언할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System.Collections.Generic;
using UnityEngine;
 
public class DictionaryExample : MonoBehaviour
{
    // 문자열을 키로, 정수를 값으로 하는 딕셔너리 선언
    Dictionary<stringint> scoreDictionary;
 
    void Start()
    {
        // 딕셔너리 초기화
        scoreDictionary = new Dictionary<stringint>();
 
        // 데이터 추가
        scoreDictionary.Add("Player1"100);
        scoreDictionary.Add("Player2"150);
        scoreDictionary["Player3"= 200// Add 메서드 대신 인덱서를 사용할 수도 있다.
 
        // 값 접근
        int player1Score = scoreDictionary["Player1"];
        Debug.Log("Player1의 점수: " + player1Score);
 
        // 키 존재 여부 확인
        if (scoreDictionary.ContainsKey("Player4"))
        {
            Debug.Log("Player4의 점수: " + scoreDictionary["Player4"]);
        }
        else
        {
            Debug.Log("Player4는 딕셔너리에 존재하지 않습니다.");
        }
 
        // 값 수정
        scoreDictionary["Player2"= 180;
 
        // 값 제거
        scoreDictionary.Remove("Player3");
 
        // 전체 출력
        foreach (KeyValuePair<stringint> kvp in scoreDictionary)
        {
            Debug.Log("키: " + kvp.Key + ", 값: " + kvp.Value);
        }
    }
}
 
cs

 

주요 메서드 및 속성

Add(TKey key, TValue value): 새로운 키-값 쌍을 딕셔너리에 추가한다. 키가 이미 존재하면 예외가 발생한다.

1
2
scoreDictionary.Add("Player4", 250);
 
cs

 

Remove(TKey key): 지정한 키에 해당하는 키-값 쌍을 삭제한다. 키가 존재하지 않으면 아무 일도 일어나지 않는다.

1
2
scoreDictionary.Remove("Player1");
 
cs

 

ContainsKey(TKey key): 딕셔너리에 특정 키가 존재하는지 확인한다.

1
2
3
4
5
if (scoreDictionary.ContainsKey("Player2"))
{
    // 키가 존재할 때의 처리
}
 
cs

 

TryGetValue(TKey key, out TValue value): 키가 존재하면 해당 값을 반환하고, 존재하지 않으면 기본값을 반환한다. 예외를 피할 수 있어 안전한 방법이다.

1
2
3
4
5
6
7
8
9
10
int score;
if (scoreDictionary.TryGetValue("Player3", out score))
{
    Debug.Log("Player3의 점수: " + score);
  }
  else
  {
      Debug.Log("Player3는 딕셔너리에 존재하지 않습니다.");
  }
 
cs

 

Count: 딕셔너리에 저장된 키-값 쌍의 수를 반환한다.

1
2
Debug.Log("딕셔너리의 요소 개수: " + scoreDictionary.Count);
 
cs

 

Clear(): 딕셔너리의 모든 키-값 쌍을 제거한다.

1
2
scoreDictionary.Clear();
 
cs

 

딕셔너리 순회하기

딕셔너리를 순회하려면 foreach 문을 사용할 수 있다. 키와 값을 각각 접근하거나, 키 컬렉션 또는 값 컬렉션을 별도로 순회할 수도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 모든 키-값 쌍 순회
foreach (KeyValuePair<stringint> kvp in scoreDictionary)
{
    Debug.Log("키: " + kvp.Key + ", 값: " + kvp.Value);
}
 
// 키만 순회
foreach (string key in scoreDictionary.Keys)
{
    Debug.Log("키: " + key);
}
 
// 값만 순회
foreach (int value in scoreDictionary.Values)
{
    Debug.Log("값: " + value);
}
 
cs

 

예제: 게임 내 아이템 관리

게임에서 아이템을 관리할 때 딕셔너리를 사용하면 각 아이템의 ID나 이름을 키로 사용하여 해당 아이템의 속성이나 데이터를 쉽게 관리할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System.Collections.Generic;
using UnityEngine;
 
public class Item
{
    public int ID;
    public string Name;
    public int Power;
 
    public Item(int id, string name, int power)
    {
        ID = id;
        Name = name;
        Power = power;
    }
}
 
public class ItemManager : MonoBehaviour
{
    Dictionary<int, Item> itemDictionary;
 
    void Start()
    {
        itemDictionary = new Dictionary<int, Item>();
 
        // 아이템 추가
        itemDictionary.Add(1new Item(1"검"50));
        itemDictionary.Add(2new Item(2"활"30));
        itemDictionary[3= new Item(3"마법봉"70);
 
        // 아이템 검색
        if (itemDictionary.TryGetValue(2out Item foundItem))
        {
            Debug.Log("찾은 아이템: " + foundItem.Name + ", 파워: " + foundItem.Power);
        }
 
        // 모든 아이템 출력
        foreach (KeyValuePair<int, Item> kvp in itemDictionary)
        {
            Debug.Log("ID: " + kvp.Key + ", 이름: " + kvp.Value.Name + ", 파워: " + kvp.Value.Power);
        }
    }
}
 
cs

 

 

딕셔너리 vs. 리스트

딕셔너리와 리스트는 모두 데이터를 저장하는 데 사용되지만, 사용 목적과 접근 방식이 다르다.

 

리스트(List): 순서가 중요한 데이터나 인덱스를 통해 접근할 때 유용하다. 요소의 순서를 유지하며, 인덱스를 사용하여 요소에 접근한다.

1
2
3
4
5
List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
string firstName = names[0]; // "Alice"
 
cs

 

딕셔너리(Dictionary): 키를 통해 값을 빠르게 검색하거나, 고유한 키를 기반으로 데이터를 관리할 때 유용하다. 키의 순서는 보장되지 않는다.

1
2
3
4
5
Dictionary<string, int> ages = new Dictionary<string, int>();
ages.Add("Alice", 25);
ages.Add("Bob", 30);
int aliceAge = ages["Alice"]; // 25
 
cs

 

 

따라서, 데이터에 고유한 식별자가 필요하고 키를 통해 빠르게 접근해야 한다면 딕셔너리를 사용하는 것이 적합하다. 반면, 순서가 중요하거나 인덱스를 통해 접근해야 한다면 리스트가 더 적합하다.

주의사항

  • 키의 고유성: 딕셔너리의 키는 고유해야 한다. 동일한 키를 두 번 추가하려고 하면 ArgumentException이 발생한다.
1
2
3
4
scoreDictionary.Add("Player1", 100);
// 다음 줄은 예외 발생
scoreDictionary.Add("Player1", 150);
 
cs
  • 키와 값의 타입: 딕셔너리의 키와 값은 제네릭 타입으로 지정된다. 키 타입은 해시 코드와 비교가 가능해야 하며, 값 타입은 원하는 어떤 타입도 가능하다.
  • 성능 고려: 딕셔너리는 해시 테이블을 기반으로 하므로, 일반적으로 검색, 추가, 삭제 연산이 O(1) 시간 복잡도를 가진다. 하지만 메모리 사용량이 리스트보다 더 클 수 있다.

결론

딕셔너리는 키-값 쌍으로 데이터를 효율적으로 관리할 수 있는 강력한 자료구조이다. Unity와 C#에서 다양한 상황에 맞게 데이터를 저장하고 접근하는 데 매우 유용하게 활용할 수 있다.

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

열거형enum에서 상수값의 배열을 검색하는 getvalue  (1) 2024.09.25