ABOUT ME

Today
Yesterday
Total
  • Dictionary
    C# 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
Designed by Tistory.