Page 27 -
P. 27
여러 개의 타입 매개변수에 대해 동일한 타입 인수를 지정하는 것은 문제가 되지 않으며, 실제로
그렇게 자주 사용하기도 한다. 예를 들어, 문자열과 문자열 사이에 매핑 관계를 가지고 있는 컬렉
션이 필요하다면 Dictionary<string, string>과 같이 코드를 작성할 수 있다.
앞서 IAmConfusing의 예를 다시 살펴보면, 제네릭 타입이 아닌 enum 타입으로 IAmConfusing을 선
언한 부분을 발견할 수 있을 것이다. 이는 다음에 설명할 내용을 미리 드러내기 위해 의도적으로
포함한 예다.
2.1.3 제네릭이 될 수 있는 것
모든 타입과 모든 타입 멤버가 제네릭이 될 수 있는 것은 아니다. 선언할 수 있는 타입의 종류 자
체가 그리 많지 않으므로 제네릭이 될 수 있는 타입에 대한 규칙은 비교적 단순하다. enum은 제네
릭이 될 수 없지만, 그 외 클래스, 구조체, 인터페이스, 델리게이트는 모두 제네릭이 될 수 있다.
타입 멤버의 경우는 조금 복잡하다. 일부 멤버의 경우 다른 제네릭 타입을 사용할 수도 있기 때문
에 간혹 제네릭처럼 보일 때가 있다. 하지만 제네릭으로 선언하려면 새로운 타입 매개변수를 반드
시 포함해야 한다는 것을 기억하기 바란다.
메서드와 중첩 타입은 제네릭이 될 수 있지만, 다음에 나열한 멤버는 제네릭이 될 수 없다.
● 필드(field)
● 속성(property)
● 인덱서(indexer)
● 생성자(constructor)
● 이벤트(event)
● 종료자(finalizer)
필드를 마치 제네릭으로 선언한 것처럼 보이는 다음 예를 살펴보자. 그리고 실제로는 이 코드가
필드를 제네릭으로 선언한 것이 아님을 확인해 보자.
public class ValidatingList<TItem>
{
private readonly List<TItem> items = new List<TItem>(); 다양한 다른 멤버가 있다고 가정
}
068