HashSet과 고유성
서로 다른 값을 추적해 보세요.
HashSet과 고유성은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
HashSet이란 무엇인가요
HashSet<T>은 중복 없이 고유한 값의 컬렉션을 저장합니다. 이미 있는 값을 추가해도 아무 작업도 수행하지 않습니다.
사전과 마찬가지로 해시 테이블을 기반으로 하므로 포함 여부를 평균 O(1)에 확인할 수 있습니다. 삽입 순서는 유지하지 않습니다.
using System.Collections.Generic;
var seen = new HashSet<int>();
seen.Add(1);
seen.Add(1); // ignored, still one elementAdd는 불리언을 반환합니다
Add는 값이 새 값이면 true를 반환하고, 이미 있으면 false를 반환합니다.
이 반환값을 사용하면 별도로 Contains를 확인하지 않고 한 단계에서 중복을 감지할 수 있습니다.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var set = new HashSet<string>();
Console.WriteLine(set.Add("a")); // True
Console.WriteLine(set.Add("a")); // False
}
}빠른 포함 여부 확인
HashSet에서 Contains를 사용하는 비용은 평균 O(1)이며, List에서는 O(n)입니다.
“이 값을 본 적이 있는가?”를 반복해서 확인해야 한다면 set이 적절한 도구입니다. 컬렉션이 커질수록 속도 차이가 크게 벌어집니다.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var ids = new HashSet<int> { 10, 20, 30 };
Console.WriteLine(ids.Contains(20)); // True
Console.WriteLine(ids.Contains(99)); // False
}
}목록에서 중복 제거하기
흔한 작업 중 하나는 목록에서 고유한 값만 남기는 것입니다. 목록으로 HashSet을 만들면 O(n)에 이 작업을 수행할 수 있습니다.
결과로 얻은 set에는 각 값이 한 번씩만 들어 있습니다. 다시 목록이 필요하면 다음처럼 감싸세요: new List<int>(set).
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var nums = new List<int> { 1, 2, 2, 3, 3, 3 };
var unique = new HashSet<int>(nums);
Console.WriteLine(unique.Count); // 3
}
}합집합
UnionWith는 다른 컬렉션의 모든 요소를 추가하되 중복은 건너뜁니다. 결과에는 양쪽의 모든 항목이 들어갑니다.
이 작업은 set 자체를 직접 변경합니다. 각 항목에 대해 직접 반복하면서 Add를 호출하는 것보다 훨씬 깔끔합니다.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var a = new HashSet<int> { 1, 2, 3 };
a.UnionWith(new[] { 3, 4, 5 });
Console.WriteLine(a.Count); // 5
}
}교집합
IntersectWith는 다른 컬렉션에도 나타나는 요소만 남기고 나머지는 제거합니다.
두 문서에 공통으로 붙은 태그나 두 그룹 모두에 속한 사용자처럼 공통 항목을 찾을 때 사용하세요.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var a = new HashSet<int> { 1, 2, 3, 4 };
a.IntersectWith(new[] { 2, 4, 6 });
Console.WriteLine(string.Join(",", a)); // 2,4
}
}차집합
ExceptWith는 다른 컬렉션에 있는 요소를 set에서 제거하고, 해당 set에만 있는 요소를 남깁니다.
이는 “A에는 있지만 B에는 없는 항목”을 구하는 집합의 뺄셈 연산입니다. 변경된 항목이나 아직 처리할 항목을 계산할 때 유용합니다.
var a = new HashSet<int> { 1, 2, 3, 4 };
a.ExceptWith(new[] { 2, 4 });
// a now contains 1 and 3부분집합과 상위집합
IsSubsetOf와 IsSupersetOf는 set 사이의 포함 관계를 확인하고 bool을 반환합니다.
Overlaps는 공유되는 요소가 있는지 확인하고, SetEquals는 순서와 관계없이 두 set이 정확히 같은 요소를 갖는지 확인합니다.
var a = new HashSet<int> { 1, 2 };
var b = new HashSet<int> { 1, 2, 3 };
bool sub = a.IsSubsetOf(b); // true
bool ov = a.Overlaps(b); // true요소의 동등성
고유성은 사전 키와 마찬가지로 요소 형식의 GetHashCode와 Equals에 따라 결정됩니다.
사용자 정의 형식에서는 두 메서드를 모두 재정의하거나 record를 사용하세요. 그렇지 않으면 논리적으로 같은 두 객체가 서로 다른 것으로 처리되어 둘 다 set에 들어갑니다.
var names = new HashSet<string>(
System.StringComparer.OrdinalIgnoreCase);
names.Add("Sam");
bool dup = !names.Add("SAM"); // true: treated as same인덱싱과 순서가 없습니다
HashSet에는 인덱스로 접근할 수 없으므로 set[0]처럼 작성할 수 없습니다. foreach로만 열거할 수 있습니다.
열거 순서는 보장되지 않습니다. 고유성과 정렬 순서가 모두 필요하다면 SortedSet<T>을 사용하세요. 연산 비용은 O(log n)이지만 요소를 정렬된 상태로 유지합니다.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var s = new SortedSet<int> { 3, 1, 2 };
Console.WriteLine(string.Join(",", s)); // 1,2,3
}
}이미 본 항목 추적하기
자주 사용하는 패턴은 스트림을 필터링하여 각 값이 한 번만 나타나게 하는 것입니다. set에 추가하고 Add가 true를 반환할 때만 작업하세요.
이 방법은 계속 커지는 목록을 확인하는 것보다 깔끔하고 빠르며, O(n²) 검색을 O(n)으로 바꿉니다.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var seen = new HashSet<int>();
foreach (int x in new[] { 1, 1, 2, 3, 2 })
if (seen.Add(x)) Console.Write(x + " ");
// prints 1 2 3
}
}빠른 확인
HashSet이 보장하는 것과 조회 비용을 떠올려 보세요.
복습
HashSet<T>은 고유한 값을 저장하며, 추가·삭제·포함 여부 확인의 평균 비용은 O(1)입니다. 단, 순서나 인덱싱은 제공하지 않습니다.
중복 제거, 빠른 “이 값을 본 적이 있는가” 확인, 그리고 UnionWith, IntersectWith, ExceptWith를 통한 집합 연산에 특히 유용합니다. 사용자 정의 요소 형식에는 올바른 동등성 비교가 필요합니다.
자주 묻는 질문
“HashSet과 고유성” 강의는 무료인가요?
네 — “HashSet과 고유성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“HashSet과 고유성”에서 뭘 배우나요?
서로 다른 값을 추적해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“HashSet과 고유성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.