반응형

✅ 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 - 키값, 값 둘다음. 하지만 키값은 중복안됨.

여기서봤을떄는 딕셔너리와 해시테이블이 같아 보이지만. 명확하게 차이가 나는걸 알고있다.

이렇게 계속 비교하면서 공부하는게 참 재밌는거같다

https://dev-jen.tistory.com/entry/%ED%95%B4%EC%8B%9C%ED%85%8C%EC%9D%B4%EB%B8%94HashTable-vs-%EB%94%95%EC%85%94%EB%84%88%EB%A6%ACDictionary%EC%A0%9C%EB%84%A4%EB%A6%ADGeneric

 

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