Page 35 -
P. 35

는 Type 객체를 반환한다. 그리고 이 Type 타입은 제네릭을 나타내기 위해서 일부 개선되었다. 어
               떤 경우에 이런 코드를 작성하게 될지 몇 가지 예를 살펴보자.

                 ●   우선 List<T>를 포함하는 어셈블리 내에서 List<T>의 타입을 가져오려는 경우다. 타입 인
                    수를 지정하지 않은 채 List<T>에 대한 타입을 가져오면 제네릭 타입 정의(generic type

                    definition)를 얻게 된다.

                 ●   List<int> 객체의 GetType() 메서드를 호출하는 경우다. 타입 인수에 대한 정보를 얻기 위
                    해 이처럼 호출할 수도 있다.

                 ●   다음과 같이 클래스를 정의했을 때 상위 타입을 가져오고 싶은 경우도 있을 것이다.
                    class StringDictionary<T> : Dictionary<string, T>

                    Dictionary<TKey, TValue> 제네릭 타입은 두 개의 타입 매개변수를 취한다. 그중 TKey만
                    string으로 지정되었고, TValue는 T 타입 매개변수를 그대로 사용했다.


               이런 경우 상당히 혼돈스러운데, 상속의 문제도 포함되어 있기 때문이다. 다행히 Type 타입이 제
               공하는 다양한 메서드와 속성을 적절히 활용하면, 제네릭 타입 정의로부터 제네릭 인수의 타입을
               얻을 수 있다.

               typeof 연산자로 다시 돌아가서 구체적인 결과도 살펴보자. typeof(List<int>) 정도가 가장 이
               해하기 쉬운 예일 텐데, 반환된 Type 객체를 이용하면 이 타입이 List<T> 타입이며, 타입 인수가

               int임을 알아낼 수 있다. 그리고 List<int>().GetType()처럼 호출해도 동일한 객체를 얻을 수
               있다.

               다음으로 typeof(T)처럼 사용한 경우다. 이 경우 T 타입 매개변수로 지정한 타입 인수에 대한 정
               보가 Type 객체로 반환된다. 이처럼 코드를 쓰려면, 해당 제네릭 타입은 닫혀 있고 구성된 타입
               (closed, constructed type)이어야 한다. 용어 자체가 낯설 텐데, 이는 모든 타입 매개변수를 실제 타
               입으로 지정했음을 의미한다. 이는 주로 규격 문서에서 사용되는 공식 용어다. 이 같은 용어에 대
                                                                                7
               해서는 가능한 한 그 의미를 정확히 설명하려고 노력하겠지만, 제네릭과 관련된 용어 는 사실 혼
               돈스럽기만 할 뿐, 실제로는 별로 도움이 되지 않는다.

               앞서 설명한 내용이 어떤 의미인지 이해하는 가장 손쉬운 방법은 역시나 구체적인 예를 살펴보는
               것이 아닐까 싶다. 다음 예제는 서로 다른 두 가지 타입에 대해 typeof(T)와 typeof(List<T>)의
               결과를 콘솔에 출력하는 제네릭 메서드를 작성한 예다.



               7    역주 열림(open), 닫힘(closed), 구성됨(constructed), 바운드됨(bound), 바운드되지 않음(unbound)

         076
   30   31   32   33   34   35   36   37   38   39