✅ HashSet이란?
중복을 허용하지 않는 데이터 집합 (Set)을 구현한 자료구조
내부적으로는 **해시 테이블(Hash Table)**을 사용하지만,
핵심 목적은 **"중복 없는 값의 모음"**을 만드는 거야.
🔍 HashSet의 특징
❌ 중복 허용 안 함 | 같은 값을 두 번 넣어도 한 번만 저장됨 |
🔍 순서 없음 | 넣은 순서 보장 안 됨 |
⚡ 매우 빠름 | 추가, 삭제, 탐색 전부 평균 O(1) |
📦 내부 구조 | 키만 있고, 값은 없음 (딕셔너리는 key-value, 얘는 key만 존재) |
✅ HashSet 예제 (C#)
using System.Collections.Generic;
HashSet<string> names = new HashSet<string>();
names.Add("Alice");
names.Add("Bob");
names.Add("Alice"); // 중복! 무시됨
Console.WriteLine(names.Count); // 출력: 2
Console.WriteLine(names.Contains("Bob")); // true
✅ HashSet vs Dictionary (or Hashtable)
키와 값 | 키만 존재 | 키와 값 존재 |
목적 | 중복 없는 목록 | 키로 값을 매핑 |
내부 구현 | Hash Table 기반 | Hash Table 기반 |
사용 예 | 방문 여부 확인, 유니크 목록 | 설정값 저장, 데이터 검색 |
✅ 언제 쓰나?
중복 제거 | 중복 있는 리스트에서 유니크한 값만 뽑을 때 |
빠른 포함 여부 확인 | 어떤 값이 존재하는지 빠르게 검사할 때 |
태그/이름/고유값 저장 | "이미 처리했는가?"를 추적할 때 |
✅ 예: 방문한 적 있는 위치 추적
HashSet<Vector2Int> visited = new HashSet<Vector2Int>();
Vector2Int current = new Vector2Int(2, 3);
if (!visited.Contains(current))
{
visited.Add(current);
// 처음 방문한 위치 처리
}
📌 핵심 요약
HashSet<T>는 딕셔너리에서 값(value)을 없앤 버전이라고 생각하면 쉬워.
딕셔너리: key → value
해시셋: key만 저장 (중복 없음)
오 해쉬셋과 딕셔너리가 둘다 해시테이블 기반으로 만들어졌다는게 좀 신기했다. 딕셔너리는 해시테이블의 상위호환이지 해시테이블 기반인줄은 몰랐다. 다시 GPT에게 물어보니 해시테이블 기반이 맞다고 한다.
또 궁금한게 생겼다. 딕셔너리에서는 값을 없앤 버전이라고 언급하는데 그럼 딕셔너리는 중복이 허용 가능한가? 싶었다 다시 GPT에게 물어보니
❌ 딕셔너리(Dictionary)는 키(key) 중복을 허용하지 않아.
✅ 단, 값(value) 은 중복될 수 있어.
✅ 딕셔너리에서 중복이 되는 부분과 안 되는 부분
Key | ❌ 불가능 | 같은 키로 두 번 Add() 하면 예외 발생 |
Value | ✅ 가능 | 여러 키가 같은 값을 가질 수 있음 |
✅ 예시로 확인해보자
Dictionary<string, int> dict = new Dictionary<string, int>();
dict.Add("apple", 1);
dict.Add("banana", 1); // value는 중복 가능
dict.Add("apple", 2); // ❌ 오류! 키 중복
System.ArgumentException: 항목이 이미 추가되었습니다.
즉,
- "apple"이라는 키가 두 번 들어가는 건 안됨
- 값인 1이 두 번 들어가는 건 가능함
✅ 해시셋은?
- 아예 Key = Value인 구조야.
- 따라서 모든 값 자체가 고유해야 함
- 즉, "apple"을 두 번 넣으면 무시됨.
🧠 핵심 요약
Dictionary | ❌ 키는 중복 불가 / ✅ 값은 중복 가능 |
HashSet | ❌ 값 중복 불가 (값 = 키) |
음..이렇게 된다면 해시테이블도 궁금해졌다.
✅ Hashtable도 Dictionary와 마찬가지로
Key | ❌ 중복 불가 |
Value | ✅ 중복 가능 |
확실히 딕셔너리도 해시테이블 기반으로 만들어진거다 보니 키값은 둘다 똑같이 중복이 안된다고한다.
정리하자면
HashSet - 키값만 있음, 키값 중복안됨. 약간 데이터 저장용도일까...정보를 넣었는지 안넣었는지 구별할때나 있는지 없는지 구별할떄 많이 사용할 듯 하다.
Dictionary - 키값, 값 둘다있음. 하지만 키값은 중복안됨.
HashTable - 키값, 값 둘다음. 하지만 키값은 중복안됨.
여기서봤을떄는 딕셔너리와 해시테이블이 같아 보이지만. 명확하게 차이가 나는걸 알고있다.
이렇게 계속 비교하면서 공부하는게 참 재밌는거같다

C# - 해시테이블(HashTable) vs 딕셔너리(Dictionary)&제네릭(Generic)
✅ 해시테이블 (Hash Table)📌 개념키(key)를 해시 함수(Hash Function)에 넣어 나온 해시값을 기반으로 데이터를 저장하는 자료구조.내부적으로는 배열(array)와 연결 리스트 또는 트리 구조를 함께 사용
dev-jen.tistory.com
'C#' 카테고리의 다른 글
C# - Virtual & abstract (0) | 2025.07.03 |
---|---|
C# - 자료구조 (1) | 2025.07.02 |
C# - 해시테이블(HashTable) vs 딕셔너리(Dictionary)&제네릭(Generic) (0) | 2025.07.02 |
C# - .NET Runtime (1) | 2025.07.01 |
C# - 캡슐화 (1) | 2025.07.01 |