Programing/C#

C# 프로그래밍의 기초: 해시셋(HashSet)

유니얼 2024. 8. 24. 15:31
728x90

HashSet<T>은 C#에서 제공하는 중복을 허용하지 않는 컬렉션으로, 성능이 중요한 상황에서 빠르고 효율적인 데이터 관리를 가능하게 합니다. 이 블로그 포스트에서는 HashSet의 주요 특징과 활용 방법을 살펴보고, C#에서의 구현 예를 통해 이해를 돕고자 합니다.

HashSet의 기본 개념

HashSet은 집합 개념을 구현한 자료구조로, 각 요소가 유일함을 보장합니다. 이는 특정 요소의 존재 유무를 빠르게 확인할 수 있어, 중복 검사가 필요한 많은 애플리케이션에서 유용하게 사용됩니다.

주요 특징 및 장점

  1. 중복 허용 안 함: HashSet은 동일한 요소를 두 번 추가하지 않습니다. 요소가 이미 존재하면 추가 작업이 무시됩니다.
  2. 빠른 데이터 접근: 해시 테이블을 기반으로 구현되어 있기 때문에 삽입, 삭제, 검색 작업의 평균 시간 복잡도가 O(1)입니다.
  3. 순서 보장 없음: HashSet은 요소의 삽입 순서를 유지하지 않습니다. 따라서 순서에 의존하는 작업에는 적합하지 않습니다.

주요 메서드 및 활용

  • Add(T item): 요소를 추가하며, 이미 존재하는 경우 추가하지 않습니다.
  • Remove(T item): 지정된 요소를 제거합니다.
  • Contains(T item): 특정 요소가 HashSet에 있는지 확인합니다.
  • Clear(): 모든 요소를 제거합니다.
  • 집합 연산: UnionWith, IntersectWith, ExceptWith, SymmetricExceptWith 등의 메서드로 기본적인 집합 연산을 수행할 수 있습니다.

전체예제 코드

using System;
using System.Collections.Generic;

namespace CSharp_ProgramingStudy.Chapter6_DataStructure
{
    public class Class7
    {
        public void Run()
        {
            // 정수를 저장하는 HashSet 생성
            HashSet<int> numbers = new HashSet<int>();

            // 요소 추가
            numbers.Add(1);
            numbers.Add(2);
            numbers.Add(3);

            // 중복 요소 추가 시도 (추가되지 않음)
            bool added = numbers.Add(3);
            Console.WriteLine($"Was 3 added? {added}"); // 출력: Was 3 added? False

            // 요소 포함 여부 확인
            bool contains = numbers.Contains(2);
            Console.WriteLine($"Contains 2? {contains}"); // 출력: Contains 2? True

            // 요소 제거
            bool removed = numbers.Remove(2);
            Console.WriteLine($"Was 2 removed? {removed}"); // 출력: Was 2 removed? True

            // HashSet의 모든 요소 출력
            Console.WriteLine("Current elements in HashSet:");
            foreach (int number in numbers)
            {
                Console.WriteLine(number); // 출력: 1, 3 (순서는 보장되지 않음)
            }

            // 다른 컬렉션과의 연산 예시
            HashSet<int> otherNumbers = new HashSet<int> { 3, 4, 5 };

            // 합집합
            // numbers = {1,3}
            // otherNumbers = { 3, 4, 5 };
            // 합집합 => {1,3,4,5}
            numbers.UnionWith(otherNumbers);
            Console.WriteLine("UnionWith result:");
            foreach (int number in numbers)
            {
                Console.WriteLine(number); // 출력: 1, 3, 4, 5 (순서는 보장되지 않음)
            }

            // 교집합
            // numbers = {1,3,4,5}
            // otherNumbers = { 3, 4, 5 };
            // 교집합 => {3,4,5}
            numbers.IntersectWith(otherNumbers);
            Console.WriteLine("IntersectWith result:");
            foreach (int number in numbers)
            {
                Console.WriteLine(number); // 출력: 3, 4, 5 (순서는 보장되지 않음)
            }

            // 차집합
            // numbers = {3,4,5}
            // otherNumbers = { 3, 4, 5 };
            // 교집합 => {}
            numbers.ExceptWith(otherNumbers);
            Console.WriteLine("ExceptWith result:");
            foreach (int number in numbers)
            {
                Console.WriteLine(number); // 출력: 빈 출력
            }
        }
    }
}

결론

HashSet<T>은 중복을 방지하고 성능이 중요한 애플리케이션에서 데이터를 관리할 때 매우 유용합니다. C#에서 제공하는 HashSet 클래스는 집합 연산을 지원하여 복잡한 데이터 관리 요구 사항을 간단하게 해결할 수 있습니다. 데이터의 유일성을 보장해야 할 때 HashSet을 사용하는 것은 효과적인 선택입니다.

반응형