[C#] Collection - 1

이정석·2024년 3월 17일

CSharp

목록 보기
18/22

Collection

C#에서는 동일한 타입의 객체를 여러개 보관하는 방법으로 Collection이라는 클래스를 제공하는데 Linked List / Tree / Hash Table 이 주요 클래스이다.

어떤 타입을 보관할지에 따라 여러 namespace에 정의된 Collection들이 존재한다.

  • System.Collections
  • System.Collections.Specialized
  • System.Collections.Generic
  • System.Collections.Concurrent

1. Collections

Collections namespace에 존재하는 Collection는 System.Object를 저장하는 클래스로 대표적인 클래스로는 ArrayList가 있다.

Object를 저장하기 때문에 만약 값타입을 저장할 경우 박싱/언박싱이 발생할 수 있으며 특정 자료형만 넣는 것이 아닌 서로 다른 자료형을 넣어도 Object로 형변환이 되어 들어간다.

그리고 원소를 사용할 때에도 object에서 다른 자료형으로 캐스팅이 필요하다는 단점이 있다.

    ArrayList c1 = new ArrayList();

    c1.Add(1);
    c1.Add("ArrayList");

    int i = (int)c1[0];

2. Collections.Specialized

위의 문제점 중에서 object만 저장한다는 점을 개선한 클래스가 Specialized Colection이다.

일반 Collection과 다르게 특정 자료형만 저장하는 Collection을 저장한 클래스로 C#에서 주로 사용하는 자료형만 미리 정의되어 있다느 것이 특징이다.

    StringCollection c2 = new StringCollection();

    c2.Add("A");

    Console.WriteLine(c2[0]);

3. Collections.Generic

나중 버전의 C#에서 자료형의 자유도를 높이기 위해 Generic을 사용하기 위해 Generic Collection이라는 것이 나오게 되었는데 대표적인 클래스가 List가 있다.

List를 정의할 때 Generic으로 자료형을 지정하면 원소를 추가하거나 Read할 때 캐스팅이 필요없다는 장점이 있다.

    List<int> c3 = new List<int>();

    c3.Add(1); c3.Add(20);
    int i = c3[1];

4. Collections.Concurrent

Thread-safe한 Collection으로 Concurrent Collection이 존재한다. Collections.Concurrent namespace에 위치하며 대표적인 클래스로는 ConcurrentStack이 있다.

Concurrent Collection 역시 Generic으로 되어있어 자료형에 비교적 자유롭고 사용할 때 멀티쓰레드 환경에서 안전하다는 특징이 있다.


Collection Interface

C#에 있는 모든 Collection들은 인터페이스 기반으로 설계되어 있어 특정 인터페이스를 구현함으로 해당 Collection이 어떤 기능을 구행할 수 있음을 보장하는 구조도 되어있다.

Collection에 사용되는 대표적인 인터페이스로는 아래와 같은 인터페이스들이 있다.

  • IEnumerable<T>
    열거자를 반환하는 인터페이스로 GetEnumerator()를 통해 얻을 수 있다.
  • ICollection<T>
    Collection에 값을 넣고 지우는 기능을 정의하는 인터페이스로 Count, Add, Clear등의 함수들이 선언되어 있다.
  • IList<T>
    인덱스 접근을 지원하는 인터페이스로 정의되어 있지 않은 Collection들도 존재한다. this[]나 인덱스 기반 삽입(제거)을 지원한다.
profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글