I'm FanJae.

[20260514] C# ( HashSet<T> ) 본문

Unity/Unity 초격차캠프

[20260514] C# ( HashSet<T> )

FanJae 2026. 5. 14. 17:28

1) 정의

- HashSet은 중복을 허용하지 않는 자료구조이다.

- 내부적으로 해시 기반 구조를 사용하고 있다.

- 데이터의 저장 순서를 보장하지 않으며, 특정 데이터가 존재하는지 빠르게 확인할 때 자주 사용한다.


2) 필요한 이유

- HashSet은 중복 방지와 빠른 검색이 필요할 때 사용한다.

- 예를 들어, List를 사용하면 특정 값이 있는지 확인하기 위해 앞에서부터 순차적으로 탐색해야 한다.

List<int> numbers = new List<int> {1,2,3,4,5};

bool result = numbers.Contains(5);

- 하지만, HashSet은 해시 기반 구조를 사용하기 때문에 특정 데이터의 존재 여부를 빠르게 확인할 수 있다.

 

HashSet<int> numbers = new HashSet<int> {1,2,3,4,5};

bool result = numbers.Contains(5);

2-1) 사용 예시

- 상당히 많은 곳에 사용할 수 있지만 핵심은 중복 데이터 방지에 있다.

- 방문 여부 체크, 중복 닉네임 검사 등등 여러가지 목적으로 활용 가능하다.


3) 주요 동작

3-1) Add()

HashSet에 데이터를 추가한다.

- 이미 같은 값이 있으면 추가되지 않는다. (중복 데이터 미허용)

- 추가에 성공하면 true, 이미 존재하면 false를 반환한다.

HashSet<int> set = new HashSet<int>();

bool result1 = set.Add(1);
bool result2 = set.Add(2);
bool result3 = set.Add(1);

Console.WriteLine(result1); // 출력 : True
Console.WriteLine(result2); // 출력 : True
Console.WriteLine(result3); // 출력 : False

3-2) Contains()

- HashSet 안에 특정 데이터가 존재하는지 확인한다.

- 존재하면 true, 없으면 false를 반환한다.

HashSet<int> set = new HashSet<int> { 1, 2, 3 };
bool result = set.Contains(2); // 2가 존재하는지 확인

Console.WriteLine(result); // 출력 : True

3-3) Remove()

- HashSet 에서 특정 데이터를 제거한다.

- 제거에 성공하면 true, 해당 값이 없으면 false를 반환한다.

HashSet<int> set = new HashSet<int> { 1, 2, 3};

bool result1 = set.Remove(2);
bool result2 = set.Remove(5);

Console.WriteLine(result1); // 출력 : True
Console.WriteLine(result2); // 출력 : False

3-4) Count

- 현재 HashSet에 들어 있는 데이터 개수를 반환한다.

- 중복 값은 저장되지 않기 때문에 개수에도 포함되지 않는다.

HashSet<int> set = new HashSet<int>();

set.Add(1);
set.Add(2);
set.Add(2);
set.Add(3);

Console.WriteLine(set.Count); // 출력 :

3-5) Clear()

- 현재 HashSet에 들어 있는 모든 데이터를 제거한다.

HashSet<int> set = new HashSet<int> { 1, 2, 3 };

set.Clear();

Console.WriteLine(set.Count); // 출력 : 0

4) 활용 예시

4-1) 방문 체크

HashSet<int> visited = new HashSet<int>();
int node = 1;

if(!visited.Contains(node)
{
	visited.Add(node);
	Console.WriteLine("방문 처리");
}

- 이처럼, HashSet을 이용해서 방문한 노드를 삽입하여, 다시 처리하지 않도록 막을 수 있다.


4-2) 상태 이상 중복 방지

HashSet<int> statusEffects = new HashSet<string>();
string effect = "position";

if (statusEffects.Add(effect))
{
	Console.WriteLine("독 상태 적용");
}
else
{
	Console.WriteLine("이미 독 상태입니다.");
}

- 이와 같이 이미 상태 적용 중인 경우를 HashSet을 이용해서 처리하는 것도 가능하다.


5) 주의점

- HashSet은 저장 순서를 보장하지 않고, 인덱스로 접근이 불가능하다.
- 정렬된 데이터가 필요하면 List나 SortedSet을 사용해야 한다.


6) 정리

정렬된 데이터가 필요하면 List나 SortedSet을 사용해야 한다.
- HashSet은 중복을 허용하지 않는다.
-  Stack이나 Queue가 데이터를 꺼내는 순서와 관련된 부분에 초점이 맞춰져 있는 반면, HashSet은 중복 방지와 빠른 검색에 초점을 두고 있다.
- 따라서 중복 데이터를 막아야 하는 상황이나 특정 데이터의 존재 여부, 방문 여부를 체크할 때 HashSet이 유용하다.

 

 

Comments