[Unity]/[C#]

[C# 기초] #12 : Collection(Dictionary, HashTable)

극꼼 2021. 7. 21. 17:15
반응형


[서론]

자료구조 : 데이터를 구조적으로 구현하는 알고리즘

Collection : C#에서 지원하는 자료구조 클래스. List, ArrayList, Dictionary, HashTable, Stack, Queue 등이 있음.  

 

이번 포스팅에서는 이 중 Dictionary, HashTable에 대해 알아보려하는데요, 둘 다 key와 value를 사용해서 자료를 저장하는 타입이라는 공통점이 있습니다. 둘의 사용법은 거의 동일하지만 내부적으로 처리하는 기술이 다릅니다. 


[Dictionary]

: 선언 시 미리 타입을 설정하기 때문에 입출력 시 박싱, 언박싱이 일어나지 않습니다. 따라서 사용에 용이하며, 다른 타입으로 형변환하기에도 오류가 생길 우려가 없습니다. 

 

<특징>

1.Generic

2.Key와 Value 모두 선언시 타입을 입력해줘야 함.

3.박싱/언박싱이 일어나지 않음.

 

1. Dictionary 선언

var dictionary = new Dictionary<string, int>();

또는

var dic = new Dictionary<string, int>()  //바로 값 입력.
{
    {"jj", 10}, 
    {"hh", 12},    
    {"gg", 14}
}

 

2. Add (추가)

dictionary.Add("jj", 10);
dictionary.Add("hh", 12);
dictionary.Add("gg", 14);

int a = dictionary["jj"];   // a = 10

 

3. ContainsKey (Key 검색)

Debug.Log(dictionary.ContainsKey("jj"));  // "jj" 문자열이 존재할 경우 true, 아닐 경우 false를 return.

* 존재하지 않는 키를 사용하면 오류가 생기므로 항상 사용 전에 3,4번을 사용해줍니다. 

 

 

4. TryGetValue (Key를 통해 값을 반환)

int a = 0; // value와 같은 타입
if(dictionary.TryGetValue("hh", out a))      // "hh" 문자열이 존재할 경우 true, 아닐 경우 false를 return.
    Debug.Log(a);  // 12가 찍힘.

* 변수 선언을 미리하지 않아도 됩니다. 

if(dictionary.TryGetValue("gg", out int aa))
     Debug.Log(aa);  // 14가 찍힘.

 

5. KeyValuePair (Dictionary 안에 있는 데이터 foreach로 확인)

foreach(KeyValuePair<string, int> p in dictionary)
{
    Debug.Log(p.Key+","+ p.Value);
}

또는 var를 사용해도 됩니다.

foreach(var p in dictionary)
{
    Debug.Log(p.Key+","+ p.Value);
}

5. Remove

dictionary.Remove("jj")

 


[HashTable]

: 제네릭을 이용하지 않고 Object를 사용하기 때문에 모든 데이터 타입을 사용할 수 있는 장점이 있지만, 자료의 입출력에 내부적으로 박싱, 언박싱을 해줘야 합니다. 

 

<특징>

1.Non-Generic

2.Key 와 Value 모두 Object를 입력받음.

3.박싱/언박싱(Boxing/Un-Boxing)이 일어남.

 

1. HashTable 선언

Hashtable hash = new Hashtable();


2. Add

hash.Add("jj", 10);
hash.Add("hh", "apple");
hash.Add("gg", true);

hash["aa"] = "가짜";  // Add 키워드를 사용하지 않아도 이런 형태로도 추가가 가능합니다. 

 

3. ContainsKey - Dictionary와 동일

* Hashtable에는 TryGetValue 키워드가 없습니다. 

 

4. DictionaryEntry (Dictionary 안에 있는 데이터 foreach로 확인)

foreach (DictionaryEntry p in hash)
{
    Debug.Log(p.Key + "," + p.Value);
}

 

5. Remove

hash.Remove("jj");

 

6. Hashtable 안의 모든 key값과 value값 가져오는 방법

ICollection keyColl = graph.Keys;
foreach (string a in keyColl) //keyrk string일 때
{
    Debug.Log(a);
}

ICollection valueColl = graph.Values;
foreach (string a in valueColl) //value가 string일 때
{
    Debug.Log(a);
}
반응형