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 |