-
DictionaryC# 2022. 1. 25. 15:03
1. 리스트의 문제점
예를들어, 리스트의 인덱스가 수만~수십만이 되기 시작하면 특정한 인덱스를 찾기위해서는 처음부터 끝까지 검색해보는 수밖에 없다. 그러면 값을 하나 찾기위해서 너무 많은 시간을 할애하게 된다.
이러한 문제점을 해결하기위해 특정한 키를 가지고 해당하는 값을 찾아보는 방법이 있다.
이러한 상황에서 C#에서 제공하는 것이 Dictionary이다.
2. Dcitionary 선언
using System.Collections.Generic
먼저 using을 선언해줘야한다.
Dictionary<Key타입, Value타입> dic = new Dictionary<Key타입, Value타입>();
var 변수명 = new Dictionary<Key타입, Value타입>();
그리고 위의 2가지 방법으로 선언이 가능하다.
주의할 점은 Key값은 중복될 수 없다.
using System; using System.Collections.Generic; namespace CSharp { class Monster { public string type; public Monster(string type) { this.type = type; } } class Program { static void Main(string[] args) { Dictionary<string, Monster> dic = new Dictionary<string, Monster>(); dic.Add("a", new Monster("Orc")); dic.Add("b", new Monster("Slime")); dic.Add("c", new Monster("Skeleton")); foreach (KeyValuePair<string, Monster> item in dic) { Console.WriteLine("[{0}:{1}]", item.Key, item.Value.type); } } } }
Monster클래스를 선언하여 키타입으로는 string 값타입으로는 Monster를 준 코드이다.
키에 접근하려면 변수명.Key
값에 접근하려면 변수명.Value
그래서 키 a를 찾아보면 바로 new Monster("Orc")가 출력되는걸 알수있는데 여기서 Monster클래스의 멤버변수인 type를 붙여주면
new Monster("Orc").type가 되어서 "Orc"가 출력되는 걸 알 수 있다.
실행결과 3. Dictionary 관련 함수
2번의 코드에서 a, b, c 3개의 키를 만들었다.
그런데 만약 존재하지 않는 d라는 키값에 접근하려고 하면 프로그램이 정상적으로 작동하지 않을 수 있다.
이러한 문제점으로 C#에는 Dictionary를 안전하게 다루기 위한 함수가 존재한다.
- TryGetValue
Monster mon; bool found = dic.TryGetValue("d", out mon);
TryGetValue를 통해서 값을 찾으면 true를 반환하고, 찾지 못하면 false를 반환한다.
false를 반환하면 mon에는 null값이 저장된다.
- Remove
dic.Remove("a");
키를 통해 값을 제거한다.
- Clear
dic.Clear();
딕셔너리의 모든 값을 제거한다.
4. HashTable
큰 박스안에 1만개의 공이 있고 각 공에는 1~10000까지의 번호가 적혀있다고 가정을 해보자.
이 때, 특정한 번호를 찾는 경우 공을 1개씩 꺼내보면서 최악의 경우에는 10000번째의 공을 꺼내야한다.
그런데 큰 박스 대신에 작은 박스에 [1~10], [11~20], [21~30] 이런식으로 나눠담으면 더 빠르게 찾을 수 있지 않을까?
7777이라는 공을 찾는다고하면 우리는 [7771~7780] 사이의 박스만 찾아보면 최악의 경우에는 10번째의 공만 꺼내게 된다. 이러한 방법을 HashTable기법이라고 한다.
그러나 HashTable에는 한 가지 단점이 있는데 그것은 작은 박스를 엄청나게 많이 준비해야 한다는 것이다.
이것은 컴퓨터로 볼 때 메모리 측면에서 큰 손해를 본다.
즉, HashTable은 메모리를 내어주고 성능을 취한다고 생각할 수 있다.
'C#' 카테고리의 다른 글
추상클래스와 인터페이스(Interface) (0) 2022.01.25 object와 Generic(일반화) (0) 2022.01.25 리스트(List) (0) 2022.01.25 sealed키워드 (0) 2022.01.24 클래스 형변환 (0) 2022.01.24