posted by 방랑군 2012. 1. 24. 23:33

List<T>는 ArrayList의 Generic 버전이다.
Dictionary<K, V>는 HashTable의 Generic 버전이다. 등등.

 

특정 Application에서 Collection을 운용하는 경우, 관리되는 데이터 타입은 결정되어있을 것이다.
이러한 경우 ArrayList나 HashTable을 사용하는 것보다 Generic 버전의 Collection을 사용하는 것이 옳다.

 

Generic Collection 개체는 불필요한 Boxing/Unboxing 연산을 수행하지 않기 때문에 더 빠르고, 컴파일 타임에 데이터 타입이 지정되기 때문에 잘못된 데이터의 삽입으로 발생할 수 있는 오류를 사전에 잡을 수 있는 장점이 있다.

 

Generic은 C++의 Template와 닮아있다.
따라서 C++에서처럼 Generic 형태의 클래스, 메서드 또한 선언할 수 있다.

 

1. Generic 클래스
ex)
class 클래스명<T> where T:new()
{
 T _instance;

 public T GetInstance()
 {

  if (_instance == null)

  {

    _instance = new T();

  }
  _instance = value;
 }
}

 

2. Generic 메서드
ex)
static void Swap<T>(ref T i, ref T j)
{
 T temp;
 temp = i;
 i = j;
 j = temp;
}

 

C++과 비교하여 추가된 점은 제약 조건을 줄 수 있다는 점이다.

 

선언된 형식 뒤에 기재할 수 있다.
where T:struct => 값 타입만 허용
where T:class => 참조 타입만 허용
where T:new() => Default 생성자가 있을 때만 허용
where T:base => base로부터 파생된 클래스만 허용

 

static void Swap<T>(ref T i, ref T j) where T:struct // 값 타입만 허용하는 Swap 메서드.

 

두가지 이상의 제약조건을 설정하는 경우.
class 클래스명<T, U> where T:제약형식1, 제약형식2 where U:제약형식

[출처] [C#] Generic|작성자 에스이오케이