딕셔너리(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<string, int> scoreDictionary;
void Start()
{
// 딕셔너리 초기화
scoreDictionary = new Dictionary<string, int>();
// 데이터 추가
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<string, int> 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<string, int> 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(1, new Item(1, "검", 50));
itemDictionary.Add(2, new Item(2, "활", 30));
itemDictionary[3] = new Item(3, "마법봉", 70);
// 아이템 검색
if (itemDictionary.TryGetValue(2, out 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 |
---|