전체 코드
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)
{
Dictionary<int, Monster> dic = new Dictionary<int, Monster>();
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();
}
}
}
아래는 요청하신 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️⃣ 기본 동작 원리 (해시 테이블)
✔️ 키-값 저장 구조
| 키 | 값 |
|---|
| 1 | Monster(1) |
| 2 | Monster(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];
📤 안전한 값 가져오기 - TryGetValue
bool found = dic.TryGetValue(154, out Monster mon3);
| 동작 | 설명 |
|---|
| 키 존재 | mon3에 값 저장 + true 반환 |
| 키 없음 | mon3는 null + false 반환 |
❌ 삭제
dic.Remove(7);
❌ 전체 삭제
dic.Clear();
🔍 검색
if (dic.ContainsKey(3))
Console.WriteLine("3 Key가 존재합니다");
5️⃣ 성능 특성 분석
| 작업 | 성능 (평균) | 설명 |
|---|
| 추가 | O(1) | 해시로 바로 위치 결정 |
| 검색 | O(1) | 해시로 바로 위치 결정 |
| 삭제 | O(1) | 해시로 바로 위치 결정 |
| 메모리 효율 | 낮음 | 해시 테이블 특성상 빈 공간 있음 |
⚠️ 메모리를 좀 더 쓰고 성능을 얻는 구조
6️⃣ Dictionary vs List 비교
| 기준 | List | Dictionary |
|---|
| 데이터 구조 | 순서 있는 배열 | 키-값 쌍 |
| 검색 속도 | O(n) | O(1) |
| 추가 속도 | O(1) (끝에 추가) | O(1) |
| 중간 삭제 | O(n) | O(1) |
| 메모리 효율 | 좋음 | 나쁨 (해시 공간 필요) |
| 정렬성 | 보장 | 미보장 (순서 없음) |