Page 29 -
P. 29

없는 것이다. 이 경우 메서드의 첫 번째 매개변수로 List<int> 타입의 인수를 사용한 것이 추론의
               실마리가 된다. T가 int이기 때문이다.

               이 같은 타입 추론은 메서드에 인수를 전달하는 경우에만 수행되며, 값을 반환할 때는 수행되지
               않는다. 그리고 모든 타입 인수를 생략하거나 모든 타입 인수를 빠짐없이 지정하는 형태로만 사용
               할 수 있다.

               타입 추론은 제네릭 메서드에 대해서만 동작하지만, 제네릭 타입의 객체를 생성할 때도 활용할
               수 있는 방법이 있다. 예를 들어 .NET 4.0에 포함된 Tuple 관련 타입들을 살펴보자. Tuple<T1>,

               Tuple<T1, T2>, Tuple<T1, T2, T3>과 같은 제네릭 타입이 정의되어 있기도 하지만, 제네릭이 아
               니며 정적 클래스인 Tuple 타입도 있다. 이 정적 클래스에는 Create라는 이름을 가진 여러 개의
               오버로드 메서드가 존재하는데, 팩토리 메서드(factory method)의 역할을 수행한다. 이 메서드의
               일부를 옮겨 보면 다음과 같다.


                 public static Tuple<T1> Create<T1>(T1 item1)
                 {
                     return new Tuple<T1>(item1);
                 }


                 public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
                 {
                     return new Tuple<T1, T2>(item1, item2);
                 }

               코드의 내용만 봐서는 별다른 것이 없어 보이지만, 이 코드를 사용하면 Tuple을 생성할 때 명시적
               으로 타입 인수를 지정하는 대신 타입 추론의 도움을 받을 수 있다. 즉,


                 new Tuple<int, string, int>(10, "x", 20)

               이처럼 명시적으로 타입 인수를 지정하지 않고, 다음과 같이 코드를 작성할 수 있다.

                 Tuple.Create(10, "x", 20)


               이는 상당히 유용한 기법이므로 반드시 기억해 두길 바란다. 제네릭을 사용하는 것이 어렵고 까다
               로우면 사용하기 싫어질지 모른다.

               제네릭 타입에 대한 추론이 내부적으로 어떻게 수행되는지는 자세히 살펴보지 않을 것이다. 언어
               개발자들이 추론을 위한 개선된 방법들을 계속 발견함에 따라 내부 구현 방식도 지속적으로 변화
               되었다. 오버로드 해석과 타입 추론은 서로 밀접하게 연관되어 있고 상속, 타입 변환, C# 4의 선


         070
   24   25   26   27   28   29   30   31   32   33   34