Page 25 -
P. 25
5
대부분의 제네릭 메서드는 메서드의 원형을 정의할 때만 타입 매개변수를 사용하고, 실제 사용
시에는 타입 인수를 지정하지 않은 채로 사용하곤 한다. 이는 메서드의 인수 타입과 반환 타입을
이용하여 타입 매개변수의 타입을 추론하는 강력한 기능을 가지고 있기 때문이다.
그리고 제네릭 타입을 이용하여 다른 클래스를 상속하거나 인터페이스를 구현할 때는 타입 매개
변수 자체를 타입 인수로 사용하는 경우도 적지 않다. 예를 들어 List<T>는 IEnumerable<T> 인터
페이스를 구현하는데, 이때 List<T>를 다음과 같이 작성할 수 있다.
public class List<T> : IEnumerable<T>
NOTE 실제로 List<T>는 그 외에도 여러 인터페이스를 구현하지만, 여기서는 설명을 위해 단순화했다.
제네릭 타입과 제네릭 메서드의 애리티
제네릭 타입과 제네릭 메서드를 선언할 때, 꺾쇠괄호 내에 쉼표를 이용하여 여러 개의 타입 매개
변수를 둘 수 있다. 예를 들어 .NET 1의 Hashtable에 대응하는 제네릭 타입은 다음과 같다.
public class Dictionary<TKey, TValue>
제네릭 애리티(arity)란 제네릭 타입이나 제네릭 메서드에서 사용된 타입 매개변수의 개수를 말한
다. 사실 이런 용어는 일선에서 코드를 구현하는 개발자보다는 개발 서적을 쓰는 저자에게나 유용
하지만, 그래도 기억할 만한 가치는 있다. 제네릭이 아닌 타입이나 메서드는 제네릭 애리티가 0이
라고 생각할 수도 있다.
제네릭 애리티는 제네릭 타입이나 제네릭 메서드를 선언할 때, 그 각각을 고유하게 구분할 수
있는 주요 수단이 된다. 예를 들어 .NET 2.0에 포함된 IEnumerable<T>는 .NET 1.0에 포함된
IEnumerable과는 완전히 구분된다. 또한 이름과 매개변수 목록이 완전히 동일한 메서드라 하더라
도 제네릭 애리티가 다르면 서로 다른 메서드로 구분된다.
public void Method() {} 제네릭이 아닌 메서드(제네릭 애리티가 0)
public void Method<T>() {} 제네릭 애리티가 1인 메서드
public void Method<T1, T2>() {} 제네릭 애리티가 2인 메서드
5 제네릭 메서드를 정의할 때 메서드의 원형을 구성하는 다른 부분(일반 매개변수의 타입 혹은 반환 타입)에서 타입 매개변수를 사용하지 않더
라도 문제가 되지는 않지만, 이런 방식은 그다지 유용하지 않다.
066