컬렉션 및 데이터 구조Collections and Data Structures

비슷한 데이터는 컬렉션으로 저장 및 조작하면 보다 효율적으로 처리할 수 있는 경우가 많습니다.Similar data can often be handled more efficiently when stored and manipulated as a collection. System.Array 클래스 또는 System.Collections, System.Collections.GenericSystem.Collections.Concurrent, System.Collections.Immutable 네임스페이스의 클래스를 사용하여 컬렉션의 개별 요소 또는 일정 범위의 요소를 추가, 제거 및 수정할 수 있습니다.You can use the System.Array class or the classes in the System.Collections, System.Collections.Generic, System.Collections.Concurrent, System.Collections.Immutable namespaces to add, remove, and modify either individual elements or a range of elements in a collection.

컬렉션에는 제네릭 컬렉션과 제네릭이 아닌 컬렉션의 두 가지 기본 유형이 있습니다.There are two main types of collections; generic collections and non-generic collections. .NET Framework 2.0에서 추가된 제네릭 컬렉션은 컴파일 타임에 형식이 안전한 컬렉션을 제공합니다.Generic collections were added in the .NET Framework 2.0 and provide collections that are type-safe at compile time. 이로 인해 제네릭 컬렉션은 일반적으로 성능이 더 뛰어납니다.Because of this, generic collections typically offer better performance. 제네릭 컬렉션은 생성 시 형식 매개 변수를 허용하며, 컬렉션에서 항목을 추가하거나 제거할 때 Object 형식과의 캐스팅을 수행하지 않아도 됩니다.Generic collections accept a type parameter when they are constructed and do not require that you cast to and from the Object type when you add or remove items from the collection. 또한 대부분의 제네릭 컬렉션은 Windows 스토어 앱에서 지원됩니다.In addition, most generic collections are supported in Windows Store apps. 제네릭이 아닌 컬렉션은 항목을 Object로 저장하며, 캐스팅을 수행해야 합니다. 또한 이러한 컬렉션은 대부분 Windows 스토어 앱 개발용으로 지원되지 않습니다.Non-generic collections store items as Object, require casting, and most are not supported for Windows Store app development. 그러나 이전 코드에는 제네릭이 아닌 컬렉션이 포함되어 있는 경우도 있습니다.However, you may see non-generic collections in older code.

.NET Framework 4부터 System.Collections.Concurrent 네임스페이스의 컬렉션은 여러 스레드에서 컬렉션 항목에 액세스하기 위한 효율적이고 스레드로부터 안전한 작업을 제공합니다.Starting with the .NET Framework 4, the collections in the System.Collections.Concurrent namespace provide efficient thread-safe operations for accessing collection items from multiple threads. System.Collections.Immutable 네임스페이스에서 사용되는 변경할 수 없는 컬렉션 클래스(NuGet 패키지)는 기본적으로 스레드로부터 안전합니다. 작업이 원본 컬렉션의 복사본에 대해 수행되며 원본 컬렉션은 수정할 수 없기 때문입니다.The immutable collection classes in the System.Collections.Immutable namespace (NuGet package) are inherently thread-safe because operations are performed on a copy of the original collection and the original collection cannot be modified.

일반 컬렉션 기능Common collection features

모든 컬렉션은 컬렉션의 항목 추가, 제거 또는 찾기를 위한 방법을 제공합니다.All collections provide methods for adding, removing or finding items in the collection. 또한 직접/간접적으로 ICollection 인터페이스 또는 ICollection<T> 인터페이스 공유를 구현하는 모든 컬렉션은 다음 기능을 공유합니다.In addition, all collections that directly or indirectly implement the ICollection interface or the ICollection<T> interface share these features:

또한 다수의 컬렉션 클래스에는 다음 기능도 포함되어 있습니다.In addition, many collection classes contain the following features:

  • Capacity 및 Count 속성Capacity and Count properties

    컬렉션의 용량은 컬렉션에 포함할 수 있는 요소의 수이고,The capacity of a collection is the number of elements it can contain. 컬렉션의 카운트는 컬렉션에 실제로 포함되어 있는 요소의 수입니다.The count of a collection is the number of elements it actually contains. 용량이나 카운트 중 하나 또는 둘 다를 숨기는 컬렉션도 있습니다.Some collections hide the capacity or the count or both.

    대부분의 컬렉션은 현재 용량에 도달하면 자동으로 용량을 확장합니다.Most collections automatically expand in capacity when the current capacity is reached. 이때 메모리가 다시 할당되며 요소는 이전 컬렉션에서 새 컬렉션으로 복사됩니다.The memory is reallocated, and the elements are copied from the old collection to the new one. 따라서 컬렉션을 사용하는 데 필요한 코드는 감소하지만 컬렉션 성능이 저하될 수 있습니다.This reduces the code required to use the collection; however, the performance of the collection might be negatively affected. 예를 들어 List<T>의 경우 CountCapacity보다 작으면 항목을 추가하는 것은 O(1) 작업이 됩니다.For example, for List<T>, If Count is less than Capacity, adding an item is an O(1) operation. 새 요소를 포함할 수 있도록 용량을 늘려야 하는 경우 항목을 추가하는 것은 O(n) 작업이 됩니다. 여기서 n은 Count입니다.If the capacity needs to be increased to accommodate the new element, adding an item becomes an O(n) operation, where n is Count. 메모리가 여러 번 다시 할당되어 성능이 저하되는 현상을 방지하는 가장 좋은 방법은 초기 용량을 컬렉션의 예상 크기로 설정하는 것입니다.The best way to avoid poor performance caused by multiple reallocations is to set the initial capacity to be the estimated size of the collection.

    BitArray는 해당 용량과 길이 및 카운트가 모두 같은 특수한 경우입니다.A BitArray is a special case; its capacity is the same as its length, which is the same as its count.

  • 일관된 하한A consistent lower bound

    컬렉션의 하한은 첫 번째 요소의 인덱스입니다.The lower bound of a collection is the index of its first element. System.Collections 네임스페이스의 모든 인덱싱된 컬렉션은 하한이 0입니다(0부터 인덱싱됨).All indexed collections in the System.Collections namespaces have a lower bound of zero, meaning they are 0-indexed. Array의 기본 하한은 0이지만 Array.CreateInstance를 사용하여 Array 클래스의 인스턴스를 만들 때 다른 하한을 정의할 수 있습니다.Array has a lower bound of zero by default, but a different lower bound can be defined when creating an instance of the Array class using Array.CreateInstance.

  • 여러 스레드로부터의 액세스를 위한 동기화(System.Collections 클래스에만 해당됨).Synchronization for access from multiple threads (System.Collections classes only).

    System.Collections 네임스페이스의 제네릭이 아닌 컬렉션 형식은 동기화와 관련하여 어느 정도의 스레드 보안을 제공합니다(일반적으로 SyncRootIsSynchronized 멤버를 통해 노출됨).Non-generic collection types in the System.Collections namespace provide some thread safety with synchronization; typically exposed through the SyncRoot and IsSynchronized members. 이러한 컬렉션은 기본적으로 스레드로부터 안전하지 않습니다.These collections are not thread-safe by default. 확장 가능하며 효율적인 다중 스레드 방식으로 컬렉션에 액세스해야 하는 경우에는 System.Collections.Concurrent 네임스페이스의 클래스 중 하나를 사용하거나 변경할 수 없는 컬렉션을 사용하는 것이 좋습니다.If you require scalable and efficient multi-threaded access to a collection, use one of the classes in the System.Collections.Concurrent namespace or consider using an immutable collection. 자세한 내용은 스레드로부터 안전한 컬렉션을 참조하세요.For more information, see Thread-Safe Collections.

컬렉션 선택Choosing a collection

일반적으로는 제네릭 컬렉션을 사용해야 합니다.In general, you should use generic collections. 다음 표에는 몇 가지 일반적인 컬렉션 시나리오와 이러한 시나리오에서 사용할 수 있는 컬렉션 클래스에 대해 설명합니다.The following table describes some common collection scenarios and the collection classes you can use for those scenarios. 제네릭 컬렉션을 처음 사용하는 경우 이 표의 내용을 참조하여 작업에 가장 적합한 제네릭 컬렉션을 선택할 수 있습니다.If you are new to generic collections, this table will help you choose the generic collection that works the best for your task.

수행할 작업I want to… 제네릭 컬렉션 옵션Generic collection options 제네릭이 아닌 컬렉션 옵션Non-generic collection options 스레드로부터 안전하거나 변경할 수 없는 컬렉션 옵션Thread-safe or immutable collection options
키별로 빠르게 조회할 수 있도록 항목을 키/값 쌍으로 저장Store items as key/value pairs for quick look-up by key Dictionary<TKey,TValue> Hashtable

(키의 해시 코드를 기준으로 구성되는 키/값 쌍 컬렉션)(A collection of key/value pairs that are organized based on the hash code of the key.)
ConcurrentDictionary<TKey,TValue>

ReadOnlyDictionary<TKey,TValue>

ImmutableDictionary<TKey,TValue>
인덱스별로 항목 액세스Access items by index List<T> Array

ArrayList
ImmutableList<T>

ImmutableArray
FIFO(선입 선출) 방식으로 항목 사용Use items first-in-first-out (FIFO) Queue<T> Queue ConcurrentQueue<T>

ImmutableQueue<T>
LIFO(후입 선출) 방식으로 데이터 사용Use data Last-In-First-Out (LIFO) Stack<T> Stack ConcurrentStack<T>

ImmutableStack<T>
순서대로 항목 액세스Access items sequentially LinkedList<T> 권장 사항 없음No recommendation 권장 사항 없음No recommendation
항목을 컬렉션에 추가하거나 컬렉션에서 제거할 때 알림이 표시됩니다.Receive notifications when items are removed or added to the collection. (INotifyPropertyChangedINotifyCollectionChanged 구현)(implements INotifyPropertyChanged and INotifyCollectionChanged) ObservableCollection<T> 권장 사항 없음No recommendation 권장 사항 없음No recommendation
정렬된 컬렉션A sorted collection SortedList<TKey,TValue> SortedList ImmutableSortedDictionary<TKey,TValue>

ImmutableSortedSet<T>
수학 함수용 집합A set for mathematical functions HashSet<T>

SortedSet<T>
권장 사항 없음No recommendation ImmutableHashSet<T>

ImmutableSortedSet<T>

제목Title 설명Description
Collection 클래스 선택Selecting a Collection Class 다양한 컬렉션에 대해 설명하고 시나리오에 맞는 컬렉션을 선택하는 데 도움이 되는 정보를 제공합니다.Describes the different collections and helps you select one for your scenario.
일반적으로 사용되는 컬렉션 형식Commonly Used Collection Types System.Array, System.Collections.Generic.List<T>System.Collections.Generic.Dictionary<TKey,TValue>와 같이 일반적으로 사용되는 제네릭 및 제네릭이 아닌 컬렉션 형식을 설명합니다.Describes commonly used generic and nongeneric collection types such as System.Array, System.Collections.Generic.List<T>, and System.Collections.Generic.Dictionary<TKey,TValue>.
제네릭 컬렉션 사용 기준When to Use Generic Collections 제네릭 컬렉션 형식의 사용을 설명합니다.Discusses the use of generic collection types.
컬렉션 내에서 비교 및 정렬Comparisons and Sorts Within Collections 컬렉션에서 같음 비교 및 정렬 비교를 사용하는 방법을 설명합니다.Discusses the use of equality comparisons and sorting comparisons in collections.
Sorted 컬렉션 형식Sorted Collection Types 정렬된 컬렉션의 성능 및 특징에 대해 설명합니다.Describes sorted collections performance and characteristics
Hashtable 및 Dictionary 컬렉션 형식Hashtable and Dictionary Collection Types 제네릭 및 제네릭이 아닌 해시 기반 사전 형식의 기능을 설명합니다.Describes the features of generic and non-generic hash-based dictionary types.
스레드로부터 안전한 컬렉션Thread-Safe Collections 여러 스레드의 안전하고 효율적인 동시 액세스를 지원하는 System.Collections.Concurrent.BlockingCollection<T>System.Collections.Concurrent.ConcurrentBag<T> 같은 컬렉션 형식에 대해 설명합니다.Describes collection types such as System.Collections.Concurrent.BlockingCollection<T> and System.Collections.Concurrent.ConcurrentBag<T> that support safe and efficient concurrent access from multiple threads.
System.Collections.ImmutableSystem.Collections.Immutable 변경 불가능은 컬렉션을 소개하고 컬렉션 형식에 대한 링크를 제공합니다.Introduces the immutable collections and provides links to the collection types.

참고Reference

System.Array
System.Collections
System.Collections.Concurrent
System.Collections.Generic
System.Collections.Specialized
System.Linq
System.Collections.Immutable