C# - 딕셔너리 (Dictionary)

2025. 9. 26. 17:43·C#

딕셔너리 (Dictionary)

딕셔너리는 .NET에서 제공하는 Key, Value 기반의 자료 구조다.

  • Key : 검색을 위한 열쇠 역할. 중복 불가.
  • Value : 해당 Key와 매핑된 실제 값. 단순한 값이기에 중복 가능.

JS의 json 방식의 오브젝트 데이터가 생각나는 형태다.

게임에서 아이템 관리, 캐릭터 관리, 스킬 단축키, 경험치 테이블 등 다양한 곳에 활용될 수 있다.

간혹 코딩테스트에서도 활용되는 모습이 보이는데 어떨 때 사용하면 좋을지 지속적으로 고민해볼 필요가 있을 거 같다.

 

 

기본적인 사용법은 다음과 같다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, int> itemAmount = new Dictionary<string, int>();

        // 추가
        itemAmount.Add("파괴폭탄", 12);
        itemAmount.Add("회오리수류탄", 18);
        itemAmount.Add("성부", 22);

        // Key로 Value 조회
        Console.WriteLine(itemAmount["파괴폭탄"]); // 12

        // 수정 (덮어쓰기)
        itemAmount["파괴폭탄"] = 99;

        // 조회
        Console.WriteLine(itemAmount["파괴폭탄"]); // 99
    }
}

 

System.Collections.Generic을 불러와야 사용 가능한 것을 볼 수 있다.

System.Collections에 있는 해시브라운..이 아니라 해시테이블의 보완 및 강화 형태의 자료 구조라고 볼 수 있다.

 

 

 

주요 메서드

Add(Key, Value) : 새로운 키,값 쌍을 추가한다. 이미 존재하는 키라면 예외 발생.

dic.Add("Sword", 1);

 

ContainsKey(Key) : 특정 키가 있는지 확인한다.

if(dic.ContainsKey("Potion")) { ... }

 

ContainsValue(Value) : 특정 값이 있는지 확인한다.

if(dic.ContainsValue(10)) { ... }

 

Remove(Key) : 특정 키를 삭제한다.

dic.Remove("Bow");

 

Clear : 모든 요소를 삭제한다.

dic.Clear()

 

Count(Property) : 저장된 요소의 개수를 반환한다.

Console.WriteLine(dic.Count);

 

Keys,Values (Property) : 각각 모든 Key, Value 컬렉션을 반환한다.

foreach(var key in dic.Keys) Console.WriteLine(key);
foreach(var val in dic.Values) Console.WriteLine(val);

 

TryGetValue(Key, out Value) : 안전하게 값 가져오기. 키가 없으면 false 반환. TryParse와 비슷하다.

if(dic.TryGetValue("Shield", out int value)) 
    Console.WriteLine(value);

 

ElementAt(i) : LINQ 필요. 인덱스로 접근하는 편법. 그러나 딕셔너리는 순서를 보장하지 않으므로 주의해야한다.

(C# 6.0 이후로는 삽입 순서 유지가 기본 동작이라고 한다. 다만, 사양에 의해 보장된 것은 아니므로 순서 의존 로직은 피할 것을 권장하는 정도인 듯 하다.)

using System;
using System.Collections.Generic;
using System.Linq; // ElementAt을 쓰려면 필요

class Program
{
    static void Main()
    {
        Dictionary<string, int> dic = new Dictionary<string, int>();
        dic.Add("Key1", 100);
        dic.Add("Key2", 200);
        dic.Add("Key3", 300);

        for (int i = 0; i < dic.Count; i++)
        {
            var pair = dic.ElementAt(i);
            Console.WriteLine($"[{i}] {pair.Key} : {pair.Value}");
        }
    }
}

 

 


연관

 

List와 비교 표

  List Dictionary
접근 방법 인덱스 (0,1,2,…) Key
탐색 속도 O(n) 평균 O(1)
Key 중복 없음 없음
Value 중복 가능 가능
대표 사용처 순차적 데이터 빠른 검색, 매핑

 

 

ArrayList, Hashtable과의 관계

  • ArrayList, Hashtable 은 구버전 .NET의 비제네릭 컬렉션이다.
  • ArrayList → List<T> 로 대체됨.
  • Hashtable → Dictionary<TKey, TValue> 로 대체됨.
  • 이유: ArrayList와 Hashtable은 모든 데이터를 object로 관리하므로 Boxing/Unboxing 비용이 크고, 타입 안정성이 보장되지 않는다.

 

해시 테이블 (Hash Table)

  • Dictionary는 내부적으로 해시 테이블 구조를 사용한다.
  • Key를 해시 함수(Hash Function)로 변환 → 배열 인덱스로 매핑 → Value를 저장.
  • 평균 접근 시간은 O(1)로 빠르다.

해시 충돌 (Hash Collision)

  • 서로 다른 Key가 같은 해시 값을 가질 수 있다. (충돌)
  • Dictionary는 이를 처리하기 위해 체이닝(LinkedList) 나 Open Addressing 기법을 사용한다.
  • 개발자가 직접 관리할 필요는 없지만, 내부적으로 이런 구조가 돌아가고 있다는 걸 알아두면 좋다.

 

핵심 포인트 정리

  1. Dictionary와 List의 차이?
    • List는 인덱스로 접근, Dictionary는 Key로 접근.
    • List 검색은 O(n), Dictionary 검색은 평균 O(1).
  2. Dictionary의 Key와 Value 특성은?
    • Key는 중복 불가, Value는 중복 가능.
  3. Hashtable과의 차이?
    • Hashtable은 object 기반 (Boxing/Unboxing 문제).
    • Dictionary는 제네릭 기반, 타입 안정성 보장.
  4. 게임에서의 활용 예시
    • 인벤토리, 키보드 입력 매핑, 경험치 테이블, Localization 등.

 

 

 

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

C# - 덱 (Deque : Double Ended Queue)  (0) 2025.09.29
C# - 스택/큐 실습 문제 풀이  (0) 2025.09.26
C# - 스택 (Stack), 큐 (Queue)  (0) 2025.09.26
C# - BFS (너비 우선 탐색) / DFS (깊이 우선 탐색)  (0) 2025.09.25
C# - 자료구조 실습 - 인벤토리  (0) 2025.09.25
'C#' 카테고리의 다른 글
  • C# - 덱 (Deque : Double Ended Queue)
  • C# - 스택/큐 실습 문제 풀이
  • C# - 스택 (Stack), 큐 (Queue)
  • C# - BFS (너비 우선 탐색) / DFS (깊이 우선 탐색)
ellug
ellug
Web / App / Game Dev
  • ellug
    dev.ellug
    ellug
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • Javascript (React, Next) (1)
      • C# (66)
      • Graphics (1)
      • Unity (25)
      • 프로그래머스 (0)
        • Lv.0 (0)
        • Lv.1 (0)
        • Lv.2 (0)
        • Lv.3 (0)
      • AI Agent (0)
      • StableDiffusion (0)
      • ETC (1)
      • 잡담 (0)
      • 유머 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    콘솔
    Design Pattern
    firebase
    자료구조
    inputsystem
    Network
    delegate
    struct
    useState
    interface
    네트워크
    알고리즘
    최적화
    추상 클래스
    list
    Photon
    C#
    console
    function
    class
    Abstract
    게임
    stack
    터미널
    큐
    스택
    유니티
    unity
    Queue
    클래스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ellug
C# - 딕셔너리 (Dictionary)
상단으로

티스토리툴바