다음을 통해 공유


컬렉션 정의

컬렉션은 그룹화된 유사한 형식의 개체 집합입니다.

모든 형식의 개체는 Object 형식의 단일 컬렉션으로 그룹화하여 해당 언어에 고유한 구문을 활용할 수 있습니다. 예를 들어, C# foreach 문(Visual Basic의 경우 for each)에서는 컬렉션의 모든 개체가 단일 형식이어야 합니다.

하지만, Object 형식 컬렉션에서는 boxing/unboxing 또는 변환과 같이 컬렉션의 성능에 영향을 미치는 추가 프로세스가 개별 요소에 대해 수행됩니다. boxing 및 unboxing은 보통 Object 형식 컬렉션에서 값 형식을 정렬하거나 검색할 때 발생합니다.

요소의 형식이 StringCollection에서 문자열 정렬 또는 검색 등 컬렉션이 의도한 형식인 경우 List<T>과 같은 제네릭 컬렉션과 StringCollection과 같은 제네릭이 아닌 강력한 형식의 컬렉션은 이러한 성능 저하를 피할 수 있습니다. 또한, 강력한 형식의 컬렉션은 컬렉션에 추가된 각 요소의 형식 확인을 자동으로 수행합니다. 이러한 이유 때문에 가능하면 제네릭 컬렉션 클래스를 사용하는 것이 좋습니다.

ICollection 인터페이스 또는 ICollection<T> 제네릭 인터페이스를 직접 또는 간접적으로 구현하는 모든 컬렉션은 요소를 추가, 제거 또는 검색하는 메서드 이외에 다음과 같은 여러 가지 기능을 공유합니다.

  • 열거자.

    열거자는 연결된 컬렉션 사이를 이동하는 개체입니다. 이것은 컬렉션의 어떤 요소로도 이동이 가능한 포인터로 생각할 수 있습니다. 열거자는 오직 하나의 컬렉션과 연결될 수 있지만, 컬렉션은 여러 열거자를 가질 수 있습니다. C# foreach 문(Visual Basic의 경우 for each)은 열거자를 사용하고 열거자 조작을 단순화합니다.

  • 동기화 멤버(System.Collections 클래스에만 해당).

    동기화는 컬렉션의 요소에 액세스할 때 System.Collections 네임스페이스의 레거시 컬렉션 형식에 대해 일정 수준의 스레드 보안을 제공합니다. 컬렉션은 기본적으로 스레드로부터 안전하지 않습니다. 컬렉션에 대한 확장 가능하고 효율적인 다중 스레드 액세스가 필요할 경우 System.Collections.Concurrent 네임스페이스의 클래스 중 하나를 사용합니다. 자세한 내용은 스레드로부터 안전한 컬렉션을 참조하십시오.

    System.Collections 네임스페이스의 일부 클래스만 컬렉션에 대해 스레드로부터 안전한 래퍼를 만드는 Synchronize 메서드를 제공합니다. 그러나 System.Collections 네임스페이스의 모든 클래스는 파생된 클래스에서 사용할 수 있는 SyncRoot 속성을 제공하여 스레드로부터 안전한 래퍼를 직접 만들 수 있습니다. 컬렉션이 스레드로부터 안전한지 여부를 결정하기 위한 IsSynchronized 속성도 제공됩니다. ICollection<T> 제네릭 인터페이스에서는 동기화를 사용할 수 없습니다.

  • CopyTo 메서드

    모든 컬렉션은 CopyTo 메서드를 사용하여 배열로 복사할 수 있지만 새로운 배열의 요소 순서는 열거자가 요소를 반환하는 시퀀스를 기준으로 합니다. 결과적으로 생기는 배열은 항상 하한이 0인 1차원 배열이 됩니다.

ICollection<T> 제네릭 인터페이스에는 제네릭이 아닌 인터페이스에 포함되어 있지 않은 추가 멤버가 있습니다.

다음과 같은 기능이 System.Collections 네임스페이스의 일부 클래스에서 구현됩니다.

  • 용량 및 개수.

    컬렉션의 용량은 수용 가능한 요소의 수입니다. 컬렉션의 카운트는 실제로 포함되어 있는 요소의 수입니다. BitArray는 특별한 경우로, 이 컬렉션의 용량은 해당 길이와 동일하며 길이는 컬렉션 카운트와 동일합니다. 일부 컬렉션은 용량이나 카운트 또는 이 둘을 숨깁니다.

    모든 컬렉션은 현재 용량에 도달할 경우 자동으로 용량이 확장됩니다. 메모리는 다시 할당되고 요소는 기존의 컬렉션에서 새로운 컬렉션으로 복사됩니다. 이 경우 컬렉션을 사용하기 위해 필요한 코드가 줄어들지만, 컬렉션의 성능은 저하될 수 있습니다. 다중 재할당에 의해 발생하는 성능 저하를 막을 수 있는 최선의 방법은 초기 용량을 적절한 크기로 설정하는 것입니다.

  • 하한.

    컬렉션의 하한은 첫 번째 요소의 인덱스입니다. System.Collections 네임스페이스에 있는 모든 인덱싱된 컬렉션의 하한은 0입니다. Array의 기본 하한 값은 0이지만, CreateInstance를 사용하여 Array 클래스의 인스턴스를 만들 때 하한을 다르게 정의할 수 있습니다.

System.Collections 클래스는 일반적으로 다음 세 가지 형식으로 분류됩니다.

  • 일반적으로 사용되는 컬렉션.

    해시 테이블, 쿼리, 스택, 사전 및 목록과 같은 일반적인 데이터 컬렉션입니다. 널리 사용되는 여러 컬렉션의 경우 제네릭이 아닌 버전, 제네릭 버전 및 스레드로부터 안전한 제네릭 버전이 있습니다.

  • 비트 컬렉션.

    컬렉션 요소가 비트 플래그인 컬렉션입니다. 다른 컬렉션과는 약간 다르게 동작합니다.

  • 특수 컬렉션.

    StringDictionary와 같이 대게 특정 형식의 요소를 처리하기 위해 특별한 목적을 가진 컬렉션입니다.

컬렉션 클래스는 주의하여 선택하십시오. 각 컬렉션은 자신만의 기능을 가지고 있기 때문에 고유한 제한 사항도 있습니다. 컬렉션이 더 특수할수록 제한도 많아집니다. 컬렉션 선택에 대한 자세한 내용은 Collection 클래스 선택을 참조하십시오.

참고 항목

참조

System.Collections

System.Collections.Specialized

System.Collections.Generic

System.Collections.Concurrent

개념

컬렉션 및 데이터 구조

Collection 클래스 선택