Page 36 -
P. 36
예제 2-7 typeof 연산자의 결과를 출력하는 예 ▶ TypeOfExample.cs
static void PrintType<T>()
2
{
Console.WriteLine("typeof(T) = {0}", typeof(T)); typeof(T)와 typeof(List<T>)의 결과를 출력
Console.WriteLine("typeof(List<T>) = {0}", typeof(List<T>)); C# 2
}
static void Main()
{
PrintType<string>(); 타입 인수로 string을 사용하여 메서드를 호출
PrintType<int>(); 타입 인수로 int를 사용하여 메서드를 호출
}
예제 2-7의 출력 결과는 다음과 같다.
typeof(T) = System.String
typeof(List<T>) = System.Collections.Generic.List`1[System.String]
typeof(T) = System.Int32
typeof(List<T>) = System.Collections.Generic.List`1[System.Int32]
T에 대한 타입 인수로 string을 지정한 첫 번째 예에서 중요하게 살펴볼 부분은 typeof(T)에 대
한 출력 결과와 typeof(string)이 완전히 동일하고 typeof(List<T>)와 typeof(List<string>)
에 대한 출력 결과도 완전히 동일하다는 점이다. 타입 인수로 int를 지정한 경우에도 typeof(T)
와 typeof(int), 그리고 typeof(List<int>)와 typeof(List<string>))의 결과가 정확히 일치한
다. 이로써 제네릭 타입이나 제네릭 메서드를 사용하더라도 실제로 코드가 수행될 때는 타입 매개
변수가 닫혀 있고 구성된 형태임을 알 수 있다.
또한, 출력 결과를 자세히 살펴보면 리플렉션(reflection)을 사용해야 할 경우 제네릭 타입의 이름
을 어떻게 작성해야 하는지도 알 수 있다. List`1은 제네릭 애리티가 1(타입 매개변수가 한 개)인
List라는 이름의 제네릭 타입을 나타낸다. 타입 인수는 바로 뒤에 대괄호를 이용하여 나타낸다.
앞서 typeof(List<>)와 같이 타입 인수를 생략한 채 사용하는 방법도 언급한 바가 있다. 이 문
법은 오로지 typeof 내에서만 사용할 수 있는 표기법인데, 제네릭 타입 정의를 가져오기 위한
방법이다. 제네릭 애리티가 1인 경우라면 TypeName<>과 같이 쓸 수 있으며, 타입 매개변수가
한 개 이상이라면 꺾쇠괄호 내에서 쉼표(,)를 추가하면 된다. Dictionary<TKey, TValue>라면
Dictionary<,>와 같이 쓰고, Tuple<T1, T2, T3>라면 Tuple<,,>와 같이 쓰면 된다.
077