각 요소를 순회하여 접근할 수 있는 객체 집합을 나타내는 컬렉션(특히 foreach 루프를 사용해 접근할 수 있음) 컬렉션은 여러 요소를 포함하며, 즉 컬렉션 클래스 객체와 N개의 요소 객체가 존재합니다
모든 컬렉션 클래스가 IEnumerable 인터페이스를 구현하기 때문에, 모든 컬렉션 클래스 객체는 GetEnumerator() 메서드를 가지고 있으며, 이 메서드는 IEnumerator 인터페이스를 구현한 객체를 반환할 수 있습니다. 이 객체는 컬렉션 클래스 객체도 컬렉션 요소 클래스 객체도 아니고 독립적인 클래스 객체입니다. 이 객체는 컬렉션 클래스 객체 내 각 요소 객체를 반복 재생할 수 있게 해줍니다
컬렉션 클래스가 사용자 정의 컬렉션 클래스라면, 사용자는 GetEnumerator() 메서드를 구현해야 하며, 그렇지 않으면 루프를 사용할 수 없습니다. 물론, 이 커스텀 컬렉션 클래스(인터페이스를 구현하는 클래스)에 대응하는 IEnumerator 클래스도 커스터마이즈되어야 합니다
예를 들어, ArrayList 컬렉션 클래스에 대응하는 IEnumerator는 ArrayListEnumeratorSimple입니다 배열 컬렉션 클래스에 대응하는 IEnumerator는 SZArrayEnumerator입니다 (두 클래스 모두 .NET Framework 클래스 라이브러리 문서(MSDN)에는 다루어지지 않습니다)
1. System.Colloction에서 컬렉션의 동작을 나타내는 인터페이스는 다음과 같습니다: 1) 인식 모든 컬렉션의 크기, 열거 수, 동기화 방법을 정의하세요. IEnumerable에서 파생됨 이 클래스는 컬렉션 클래스의 가장 기본적인 동작을 정의하며, 모든 컬렉션 클래스는 이 인터페이스(기본 인터페이스)를 구현합니다 하지만 동작이 너무 기본적이라서, 주로 Count 속성이기 때문에 혼자서 구현하는 것은 별로 의미가 없습니다
2) IEnumerable 집합에 대한 간단한 반복을 지원하는 열거를 노출한다 이 방법은 GetEnumerator()라는 단 하나의 메서드만 가지고 있으며, 이 인터페이스는 IEnumerator를 통해 컬렉션을 탐색할 수 있습니다 기본적으로 모든 컬렉션 클래스가 이 인터페이스를 구현합니다
3) 일리스트 IList 구현은 정렬 가능하고 구성원의 인덱스로 접근할 수 있는 값들의 집합이며, 자체적으로 ICollection과 IEnumerable 인터페이스를 구현합니다 는 모든 리스트의 추상 기본 클래스입니다. IList 구현에는 읽기 전용, 고정 크기, 가변 크기의 세 가지 범주가 있습니다.
4) 신원 사전 IDictionary 구현은 ICollection과 IEnumerable 인터페이스를 구현하는 키/값 쌍의 집합입니다 는 키/값 쌍 집합의 기본 인터페이스입니다. IDictionary 구현에는 읽기 전용, 고정 크기, 가변 크기의 세 가지 범주가 있습니다. IDictionary는 사전, 맵 또는 샤시 리스트라고 불릴 수 있으며, 키(모든 유형의 키)를 기반으로 값에 접근합니다.
2. System.Collections에서 직접 사용할 수 있는 컬렉션 클래스는 다음과 같습니다: 1) ArrayList 인터페이스 구현: IList, ICollection, IEnumerable 컬렉션이 수정되지 않는 한, ArrayList는 동시에 여러 리더를 안전하게 지원할 수 있습니다 ArrayList에 요소가 추가될 때, 용량은 재할당(2배 증가)을 통해 자동으로 증가합니다 객체 배열을 생성해야 하지만 배열 크기를 미리 모른다면 ArrayList를 사용할 수 있습니다 ArrayList는 모든 요소를 객체로 참조하므로, ArrayList 내 요소에 접근할 때 반드시 타입을 지정해야 합니다 장점: 크기를 동적으로 변경할 수 있고, 요소의 삽입과 제거가 유연하고 편리하며, 정렬 가능성 단점: 삽입 성능은 배열만큼 좋지 않고, 강력한 타입은 아닙니다
2) 비트어레이 인터페이스 구현: ICollection과 IEnumerable 압축된 비트 배열을 관리하세요.
3) 해시테이블 인터페이스 구현: IDictionary, ICollection, IEnumerable ArrayList 같은 요소들은 Hashtable에 자유롭게 추가하거나 제거할 수 있지만, 성능 부담 없이 사용할 수 있습니다
4) 정렬목록 인터페이스 구현: IDictionary, ICollection, IEnumerable SortedLIst는 ArrayList와 해시테이블의 장점을 결합했으며, 키 값으로 정렬할 수 있습니다
5) 줄기 인터페이스 구현: ICollection과 IEnumerable 퀘케는 개별 요소에 대한 선입선출 접근 방식의 큐입니다 Queque 객체의 GetEnumerator() 메서드를 호출하면 IEnumerator 객체가 큐 내 요소들을 반복하도록 할 수 있습니다
6) 스택 인터페이스 구현: ICollection과 IEnumerable 스택은 개별 요소에 대해 늦게 들어가 선출 방식으로 접근하는 스택입니다 Stack 객체의 GetEnumerator() 메서드를 호출하면 IEnumerator 객체가 스택 내 요소들을 반복하도록 할 수 있습니다
3. 위에서 언급한 컬렉션 클래스들은 모두 일반 컬렉션 클래스이며, 객체가 입력될 때 대부분의 요소는 객체 타입에 속합니다 컬렉션 이후에는 원래의 타입 정보가 사라지며, 즉 이러한 일반 콜렉션 클래스들은 강타입이 되지 않습니다 우회 방법은 강타입 컬렉션 클래스를 사용하는 것입니다 System.Collections 네임스페이스 System.Collections.Specialized된 네임스페이스 일부 클래스는 요구사항을 충족할 수 있으며 직접 또는 상속할 수 있습니다
|