전체 코드


class Monster
{
    public int id;
    
    public Monster(int id)
    { 
        this.id = id; 
    }
}
using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;

namespace CSharp
{
    
    
    class Program
    {
        

        static void Main(string[] args)
        {
            // 리스트 단점

            // 대부분 게임에서는 몬스터 나 몬스터에게 ID를 부여함

            // 리스트로 관리하면 검색이 힘들어짐 인덱스 하나마다 다 체크하면 찾으면 비효율 적임

            // 따라서 특정 Key를 가지고 찾아야하는 방법이 더 효율적임

            // Dictionary

            // key - value


            Dictionary<int, Monster> dic = new Dictionary<int, Monster>();

            //dic.Add(1, new Monster(1));

            //dic[5] =  new Monster(5);

            for (int i = 0; i < 10000; i++)
            {
                dic.Add(i, new Monster(i));
            }

            Monster mon = dic[5000];

            // 찾기 함수
            bool found = dic.TryGetValue(7777, out mon);


            // 삭제
            dic.Remove(7777); // 키를 이용해서 삭제

            dic.Clear();

            // 인터페이스가 리스트랑 비슷함

            // 딕셔너리는 어떻구 현이 되어 있길래 리스트보다 검색이 빠를까?

            // 해쉬테이블로 구현이 되어있음

            // 박스에서 공을 찾는 문제

            // 박스를 여러개 쪼개 놓는다.

            // 각 10개씩 배분해서 찾으면 찾기가 편함
            // [1-10][...][...][...][]
            
            // 데이터가 어떤 박스에 있는 알기 편하게 해서 찾는 방법

            // 해시테이블 방법
        
            // 메모리를 많이 사용해되서 메모리가 비효율적
        
        }
    }
}

아래는 요청하신 C# Dictionary 강의 정리 및 코드 분석 완전체입니다.
한 줄 한 줄 꼼꼼하게 설명하며, 개념, 문법, 내부 동작, 성능 특성, 활용법까지 한 번에 정리했으니
블로그에도 바로 올려도 되고, 공부 자료로도 완벽하게 쓰실 수 있습니다.


1️⃣ Dictionary란?

키(Key)를 통해 값(Value)를 저장하고 검색하는 자료구조
✅ 내부적으로 해시 테이블(Hash Table) 사용
✅ 데이터 수가 많아도 탐색 성능 O(1) 보장
✅ 키만 알면 순식간에 값을 찾을 수 있음
✅ C++의 unordered_map과 비슷한 개념


2️⃣ 기본 문법과 생성 방법

네임스페이스 임포트

using System.Collections.Generic;
  • 제네릭 컬렉션이므로 System.Collections.Generic 필요

선언과 생성

Dictionary<int, Monster> dic = new Dictionary<int, Monster>();
구분의미
int키 타입
Monster값 타입
new실제 메모리 할당 (힙 영역)

3️⃣ 기본 동작 원리 (해시 테이블)

✔️ 키-값 저장 구조

1Monster(1)
2Monster(2)
......
  • 키로 해시 함수(Hash Function) 수행
  • 계산된 해시 값에 해당하는 위치에 데이터 저장
  • 찾을 때도 같은 해시 함수로 위치를 바로 찾음 (O(1))

4️⃣ 주요 메서드 분석

📥 Add - 키와 값을 추가

dic.Add(1, new Monster(1));
  • 키 1에 Monster(1) 저장
  • 같은 키 추가 시 예외 발생

📥 대괄호로 추가/수정

dic[5] = new Monster(5);
  • 키 5가 있으면 수정
  • 키 5가 없으면 새로 추가 (Add와 다름)

📤 값 가져오기 - 대괄호 접근

Monster mon = dic[5];
  • 키 5의 값을 꺼냄
  • 키가 없으면 예외 발생

📤 안전한 값 가져오기 - TryGetValue

bool found = dic.TryGetValue(154, out Monster mon3);
동작설명
키 존재mon3에 값 저장 + true 반환
키 없음mon3는 null + false 반환

❌ 삭제

dic.Remove(7);
  • 키 7의 데이터를 제거
  • 키가 없으면 무시

❌ 전체 삭제

dic.Clear();
  • 모든 데이터 삭제 (Count = 0)

🔍 검색

if (dic.ContainsKey(3))
    Console.WriteLine("3 Key가 존재합니다");
  • 키가 있는지만 확인할 때 효율적

5️⃣ 성능 특성 분석

작업성능 (평균)설명
추가O(1)해시로 바로 위치 결정
검색O(1)해시로 바로 위치 결정
삭제O(1)해시로 바로 위치 결정
메모리 효율낮음해시 테이블 특성상 빈 공간 있음

⚠️ 메모리를 좀 더 쓰고 성능을 얻는 구조


6️⃣ Dictionary vs List 비교

기준ListDictionary
데이터 구조순서 있는 배열키-값 쌍
검색 속도O(n)O(1)
추가 속도O(1) (끝에 추가)O(1)
중간 삭제O(n)O(1)
메모리 효율좋음나쁨 (해시 공간 필요)
정렬성보장미보장 (순서 없음)

profile
李家네_공부방

0개의 댓글