Page 28 -
P. 28

이 예제는 List<T>에서와 같이 타입 매개변수의 이름으로 T를 그대로 사용하지 않고, TItem이라
                    고 다르게 사용했다. 즉, items 필드는 List<TItem> 타입이며, 이 경우 TItem은 List<T>의 타입
                                                                                                      2
                    인수로 사용되었다는 것에 주목할 필요가 있다. 타입 매개변수는 필드를 정의할 때 사용된 것이

                    아니라 클래스를 정의할 때 사용되었을 뿐이다.                                                         C# 2
                    특정 멤버를 반드시 제네릭으로 작성해야 하는 경우를 떠올리기란 쉽지 않다. 간혹 생성자나 인덱
                    스를 제네릭으로 만들고 싶을 수도 있을 것이다. 이때는 그저 일반적인 제네릭 메서드를 작성하는

                    것으로 대응할 수 있다.

                    앞서 제네릭 메서드를 호출하는 방법을 설명할 때, 경우에 따라서는 타입 인수를 생략할 수 있음
                    을 확인했다. 이처럼 소스 코드에 타입 인수를 지정하지 않으면, 컴파일러가 타입 인수의 타입을
                    추론한다.




                    2.1.4  메서드의 타입 인수에 대한 타입 추론


                    예제 2-5에서 가장 중요한 부분을 다시 살펴보자. 다음과 같은 제네릭 메서드가 있었다.


                       public static List<T> CopyAtMost<T>(List<T> input, int maxElements)

                    그리고 Main 메서드 내에서 List<int> 타입의 number 변수를 선언한 후에, 이를 CopyAtMost의 인
                    수로 전달했다.


                       List<int> numbers = new List<int>();
                       ...
                       List<int> firstTwo = CopyAtMost<int>(numbers, 2);

                    메서드 호출 부분을 집중해서 살펴보자. CopyAtMost를 정의할 때 타입 매개변수를 사용했으므로

                    호출 시에 타입 인수를 지정하는 것은 당연한 일이다. 하지만 이 경우 타입 인수를 지정하지 않아
                    도 되며, 그저 다음과 같이 코드를 작성하면 된다.

                       List<int> numbers = new List<int>();
                       ...
                       List<int> firstTwo = CopyAtMost(numbers, 2);


                    컴파일러가 생성한 IL 코드를 비교해 보면 두 코드의 결과는 완전히 동일하다. 컴파일러가 개발자
                    를 대신하여 타입 인수의 타입을 추론해 주기 때문에 애써 타입 인수를 명시적으로 지정할 필요가



                                                                                                  069
   23   24   25   26   27   28   29   30   31   32   33