C#에서는 동일한 타입의 객체를 여러개 보관하는 방법으로 Collection이라는 클래스를 제공하는데 Linked List / Tree / Hash Table 이 주요 클래스이다.
어떤 타입을 보관할지에 따라 여러 namespace에 정의된 Collection들이 존재한다.
Collections namespace에 존재하는 Collection는 System.Object를 저장하는 클래스로 대표적인 클래스로는 ArrayList가 있다.
Object를 저장하기 때문에 만약 값타입을 저장할 경우 박싱/언박싱이 발생할 수 있으며 특정 자료형만 넣는 것이 아닌 서로 다른 자료형을 넣어도 Object로 형변환이 되어 들어간다.
그리고 원소를 사용할 때에도 object에서 다른 자료형으로 캐스팅이 필요하다는 단점이 있다.
ArrayList c1 = new ArrayList();
c1.Add(1);
c1.Add("ArrayList");
int i = (int)c1[0];
위의 문제점 중에서 object만 저장한다는 점을 개선한 클래스가 Specialized Colection이다.
일반 Collection과 다르게 특정 자료형만 저장하는 Collection을 저장한 클래스로 C#에서 주로 사용하는 자료형만 미리 정의되어 있다느 것이 특징이다.
StringCollection c2 = new StringCollection();
c2.Add("A");
Console.WriteLine(c2[0]);
나중 버전의 C#에서 자료형의 자유도를 높이기 위해 Generic을 사용하기 위해 Generic Collection이라는 것이 나오게 되었는데 대표적인 클래스가 List가 있다.
List를 정의할 때 Generic으로 자료형을 지정하면 원소를 추가하거나 Read할 때 캐스팅이 필요없다는 장점이 있다.
List<int> c3 = new List<int>();
c3.Add(1); c3.Add(20);
int i = c3[1];
Thread-safe한 Collection으로 Concurrent Collection이 존재한다. Collections.Concurrent namespace에 위치하며 대표적인 클래스로는 ConcurrentStack이 있다.
Concurrent Collection 역시 Generic으로 되어있어 자료형에 비교적 자유롭고 사용할 때 멀티쓰레드 환경에서 안전하다는 특징이 있다.
C#에 있는 모든 Collection들은 인터페이스 기반으로 설계되어 있어 특정 인터페이스를 구현함으로 해당 Collection이 어떤 기능을 구행할 수 있음을 보장하는 구조도 되어있다.
Collection에 사용되는 대표적인 인터페이스로는 아래와 같은 인터페이스들이 있다.
GetEnumerator()를 통해 얻을 수 있다.Count, Add, Clear등의 함수들이 선언되어 있다.this[]나 인덱스 기반 삽입(제거)을 지원한다.