컬렉션 선택하기
선택에 따른 차이와 성능을 배워 보세요.
컬렉션 선택하기은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
먼저 질문 하나
컬렉션을 선택할 때는 한 가지 질문에서 시작합니다. 데이터에 어떻게 접근할 것인가요? 위치로 접근할까요, 키로 접근할까요, 아니면 포함 여부만 확인할까요?
List, Dictionary, HashSet은 각각 서로 다른 접근 패턴에 대응합니다. 패턴에 맞는 도구를 선택하면 코드가 빠르고 명확하게 유지됩니다.
위치로 접근하기: 목록
순서가 중요하고 인덱스로 항목에 접근한다면 List<T>를 선택하세요. 삽입 순서를 유지하고 O(1)에 인덱싱할 수 있습니다.
예를 들어 작업 단계의 대기열, 표시 순서대로 정렬된 행, 또는 앞에서 뒤로 순회하는 모든 시퀀스에 사용할 수 있습니다. 중복은 허용됩니다.
var steps = new List<string> { "mix", "bake", "cool" };
string first = steps[0]; // O(1) by index키로 접근하기: 사전
고유 식별자로 항목을 조회한다면 Dictionary<K,V>를 선택하세요. 평균 O(1)에 키를 값에 매핑합니다.
예를 들어 사용자 ID를 사용자에 매핑하거나, 국가 코드를 국가 이름에 매핑하거나, 단어를 해당 단어의 개수에 매핑할 수 있습니다. 키는 “어느 항목인지”를 나타내고 값은 데이터를 담습니다.
var users = new Dictionary<int, string> {
[101] = "Ann",
[102] = "Bob"
};
string name = users[101];포함 여부와 고유성: HashSet
값이 있는지만 중요하거나 중복을 거부해야 한다면 HashSet<T>을 선택하세요. Contains의 평균 비용은 O(1)입니다.
예를 들어 방문한 URL, 허용된 권한, 고유한 태그에 사용할 수 있습니다. 요소에 연결된 값은 없고 요소의 존재 여부만 관리합니다.
var visited = new HashSet<string>();
if (visited.Add(url)) {
// first time seeing this url
}비용 표
평균 비용은 다음과 같습니다. List의 인덱싱은 O(1)이지만 Contains는 O(n)입니다. Dictionary와 HashSet의 조회는 O(1)입니다.
끝에 수행하는 List.Add는 분할 상환 비용이 O(1)이고, 중간에 삽입하거나 삭제하는 비용은 O(n)입니다. 사전과 HashSet의 추가 및 삭제는 평균 O(1)입니다.
// List: index O(1), Contains O(n)
// Dictionary: by-key O(1), no index
// HashSet: Contains O(1), no value, no indexList의 Contains는 경고 신호입니다
반복문 안에서 list.Contains를 계속 호출하면 O(n²) 함정에 빠집니다. 각 확인이 목록 전체를 검색하기 때문입니다.
포함 여부 확인이 대부분을 차지한다면 HashSet으로 바꾸세요. 이 한 가지 변경만으로도 대규모 데이터에서 느린 반복문을 즉시 실행되는 수준으로 바꿀 수 있습니다.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var allow = new HashSet<int> { 2, 4, 6 };
foreach (int n in new[] { 1, 2, 3, 4 })
if (allow.Contains(n)) Console.Write(n + " ");
}
}키와 순서가 모두 필요할 때
키로 조회하면서 예측 가능한 순서도 필요하신가요? 표준 Dictionary는 순서를 보장하지 않습니다.
조회용 Dictionary와 함께 순서용 List를 유지하거나, 키를 정렬된 순서로 유지하는 SortedDictionary<K,V>를 사용해 보세요. 후자의 비용은 O(log n)입니다.
var sorted = new SortedDictionary<string, int>();
sorted["b"] = 2;
sorted["a"] = 1;
// enumerates a then b, in key order메모리 절충
해시 기반 컬렉션은 속도를 얻는 대신 메모리를 더 사용합니다. Dictionary와 HashSet은 내부 버킷을 유지하므로 메모리를 촘촘하게 사용하는 List나 배열보다 많은 메모리를 사용합니다.
몇 개뿐인 작은 컬렉션에서는 목록을 검색하는 편이 실제로 충분하고 메모리도 덜 사용할 수 있습니다. 해싱의 이점은 규모가 커질 때 나타납니다.
인터페이스를 기준으로 프로그래밍하기
메서드 시그니처는 작동하는 가장 덜 구체적인 형식을 요구해야 합니다. 읽기에는 IEnumerable<T>, 인덱스를 사용한 읽기에는 IReadOnlyList<T>, 키 접근에는 IDictionary<K,V>를 받으세요.
이렇게 하면 호출자가 구체적인 선택에 종속되지 않으므로, 나중에 시그니처를 깨뜨리지 않고 구현을 교체할 수 있습니다.
int Sum(IEnumerable<int> values) {
int total = 0;
foreach (int v in values) total += v;
return total;
}완성된 예제
텍스트에서 고유한 단어의 개수를 세는 작업에는 두 컬렉션을 함께 사용합니다. HashSet은 이미 본 단어를 추적하고, Dictionary는 개수를 셉니다.
각 컬렉션은 하나의 작업을 잘 처리합니다. set은 고유성을 보장하고 사전은 단어를 빈도에 매핑하며, 두 작업 모두 연산당 평균 O(1)입니다.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var counts = new Dictionary<string, int>();
foreach (var w in "a b a c b a".Split(' '))
counts[w] = counts.GetValueOrDefault(w) + 1;
Console.WriteLine(counts["a"]); // 3
}
}선택 점검 목록
다음 순서로 질문하세요. 키를 값에 매핑해야 하나요? Dictionary를 사용하세요. 고유성이나 포함 여부만 필요하신가요? HashSet을 사용하세요.
그렇지 않다면 순서와 인덱스 접근이 필요하고 중복도 허용해야 하나요? List를 사용하세요. 이 짧은 점검 목록으로 대부분의 일상적인 경우를 해결할 수 있습니다.
빠른 확인
구체적인 요구 사항에 선택 점검 목록을 적용해 보세요.
복습
접근 패턴에 따라 선택하세요. 순서가 있고 인덱스로 접근하는 시퀀스에는 List, 키에서 값으로 조회할 때는 Dictionary, 고유성과 포함 여부에는 HashSet을 사용합니다.
Big-O를 확인하세요. 자주 실행되는 반복문에서 List.Contains를 피하고, O(1) 해시 조회를 활용하며, 인터페이스를 기준으로 프로그래밍하여 선택의 유연성을 유지하세요.
자주 묻는 질문
“컬렉션 선택하기” 강의는 무료인가요?
네 — “컬렉션 선택하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“컬렉션 선택하기”에서 뭘 배우나요?
선택에 따른 차이와 성능을 배워 보세요. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“컬렉션 선택하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 실전 목록 사용
- 사전 조회
- HashSet과 고유성
- 컬렉션 선택하기