본문 바로가기

C#/기본 문법

C# HashSet<T> (자료구조)

 

HashSet <T>은 중복을 허용하지 않는 집합(콜랙션)을 구현한 자료구조이다.

또한 내부적으로 해시 테이블 (Hash Table)을 사용하여, 빠른 검색, 추가, 삭제를 제공한다.


✅ HashSet <T> 기본 사용법

class Program
{
    static void Main()
    {
        HashSet<int> numbers = new HashSet<int>();

        numbers.Add(10);
        numbers.Add(20);
        numbers.Add(30);
        numbers.Add(10);  // 중복 값 -> 추가되지 않음

        Console.WriteLine("HashSet 요소:");
        foreach (var num in numbers)
        {
            Console.WriteLine(num);
        }

        // 값 확인
        Console.WriteLine(numbers.Contains(20)); // true
        Console.WriteLine(numbers.Contains(50)); // false

        // 값 삭제
        numbers.Remove(20);
        Console.WriteLine(numbers.Contains(20)); // false
    }
}

 

출력결과

HashSet 요소:
10
20
30
True
False
False

 

위와 같이 HastSet은 중복된 요소는 한번만 저장되고 List<T>와 동일하게 Add() , Remove(), Contains()가 가능하다.

 


✅ HashSet <T> 주요 메서드

Add(T item) 요소 추가 (중복이면 무시됨)
Remove(T item) 요소 삭제
Contains(T item) 요소 포함 여부 확인 (O(1))
Clear() 모든 요소 삭제
UnionWith(IEnumerable<T>) 다른 집합과 합집합 수행
IntersectWith(IEnumerable<T>) 다른 집합과 교집합 수행
ExceptWith(IEnumerable<T>) 특정 집합 요소를 제외
IsSubsetOf(IEnumerable<T>) 현재 집합이 특정 집합의 부분집합인지 확인
IsSupersetOf(IEnumerable<T>) 현재 집합이 특정 집합의 상위 집합인지 확인

 

주요 메서드는 위와 같으며, 인자로 받는 타입은 IEnumerable <T>로 List <T>, Array 등과 HashSet의 요소와 비교하는 게 가능하다는 점이 특징이다.

 

 

아래는 HashSet 과 List를 비교하는 메서드 활용의 예시이다.

static void Main()
    {
        HashSet<int> setA = new HashSet<int> { 1, 2, 3, 4, 5 };
        List<int> listB = new List<int> { 4, 5, 6, 7, 8 };  // List<T>

        // 집합 (setA ∪ listB)
        setA.UnionWith(listB);
        Console.WriteLine("합집합: " + string.Join(", ", setA));
        // 결과: 1, 2, 3, 4, 5, 6, 7, 8
    }

 


 

이러한 HashSet<T>는  List <T>와 거의 비슷한 성질을 가졌지만 아래와 같은 차이점이 존재한다

✅ List<T> vs HashSet <T> 차이

비교 항목List<T>HashSet<T>

중복 허용 ✅ 가능 ❌ 불가능
탐색 속도 (Contains()) ❌ 느림 (O(n)) ✅ 빠름 (O(1))
추가 속도 (Add()) 보통 O(1), 중간에 삽입 시 O(n) 평균 O(1)
순서 유지 ✅ 순서 있음 ❌ 순서 없음
사용 예시 순서가 중요할 때 (리스트, 대기열) 빠른 중복 체크, 집합 연산

 


 

HashSet 요약

요소의 내부 데이터를 List <T> 보다 빠르게 접근하기 때문에,

1. 특정 값이 존재하는지 확인집합 연산 시 ( 교집합, 합집합 )에 사용하는 것이 좋다.

2. HashSet의 특성상 불가능한 순서 or 중복요소가 있을 경우 List <T>를 통해 구현하는 것이 좋다.

'C# > 기본 문법' 카테고리의 다른 글

C# Parsing  (0) 2025.02.17
C# Object  (0) 2025.02.13
C# Stack (자료구조)  (0) 2025.02.11
C# Nullable  (0) 2025.02.10
(C#) 람다식 + (무명 메소드)  (0) 2024.03.09