Page 26 -
P. 26
타입을 선언할 때도 제네릭 애리티가 다르면, 유사한 용도로 사용된다 하더라도 동일한 부류로 다
뤄지지 않는다. 극단적인 예가 되겠지만, 하나의 어셈블리 내에 아래의 타입들을 한꺼번에 선언할
2
수 있다.
public enum IAmConfusing {} C# 2
public class IAmConfusing<T> {}
public struct IAmConfusing<T1, T2> {}
public delegate void IAmConfusing<T1, T2, T3> {}
public interface IAmConfusing<T1, T2, T3, T4> {}
이처럼 동일한 이름으로 여러 타입을 선언하는 것은 대체로 피해야 할 방법이지만 이런 방식이 나
름 유용하게 사용될 수도 있다. 예를 들면, 제네릭 타입이 아닌 정적 클래스가 동일한 이름을 가진
여러 종류의 제네릭 타입들을 참조하는 헬퍼 메서드를 포함하는 경우다(정적 클래스는 2.5.2절에
서 다룬다). 구체적인 예로 2.1.4절에서 Tuple 클래스를 살펴볼 것인데, 이 클래스를 이용하면 다
양한 형태의 제네릭 Tuple 클래스의 인스턴스를 생성할 수 있다.
제네릭 애리티가 다르기만 하면 동일한 이름으로 여러 타입을 선언할 수 있는 것과 마찬가지로,
제네릭 애리티가 다르기만 하면 동일한 이름으로 여러 메서드를 선언할 수 있다. 이는 마치 매개
변수의 타입과 목록이 다르면 여러 개의 오버로드를 정의할 수 있는 것과 유사한데, 타입 매개변
수의 개수를 반드시 달리해야 한다는 점에서는 조금의 차이가 있다. 제네릭 애리티가 다르면 다른
메서드로 간주하지만, 타입 매개변수 이름 자체는 메서드를 구분하는 기준이 되지 않는다. 이런
이유로 다음 두 메서드는 동시에 선언할 수 없다.
public void Method<TFirst>() {}
public void Method<TSecond>() {} 컴파일 타임 에러. 타입 매개변수의 이름만으로는 오버로드를 작성할 수 없다.
이 두 메서드는 메서드의 원형이 완전히 동일한 것으로 간주되므로 일반적인 메서드 오버로드 작
성 규칙에 따라 동시에 작성할 수 없다. 일반 매개변수의 개수를 달리하는 등의 방식으로 각각의
메서드를 구분할 수 있다면 서로 다른 이름의 타입 매개변수를 가진 메서드를 동시에 작성할 수도
있지만, 과연 그럴 필요가 있을까 싶다.
여러 개의 타입 매개변수를 사용하는 경우, 일반 매개변수와 마찬가지로 타입 매개변수의 이름을
동일하게 지정할 수 없다. 즉, 다음과 같이 메서드를 선언할 수는 없다.
public void Method<T, T>() {} 컴파일 타임 에러. 타입 매개변수 T 중복
067