Page 24 -
P. 24

이제 List<T>가 제공하는 메서드와 속성 등을 살펴보자. 그림 2-2처럼 list 변수를 사용하고 있
                    다면, API에서 T라고 정의한 부분은 모두 string이 된다. 예를 들어 List<T> 내의 Add 메서드의
                                                                                                      2
                    원형은 다음과 같다.

                       public void Add(T item)                                                        C# 2


                    하지만 Visual Studio에서 list.Add라고 입력하면 인텔리센스는 item 매개변수가 마치 string으
                    로 선언된 것처럼 결과를 보여준다. 이때 해당 인수로 다른 타입을 전달하면 컴파일 오류가 발생
                    한다.

                    그림 2-2에서 살펴본 제네릭 클래스의 예와 같이 메서드도 제네릭으로 선언할 수 있다. 제네릭

                    메서드를 선언할 때는 타입 매개변수를 메서드 원형의 일부로 포함시키면 된다. 메서드의 타입 매
                    개변수는 종종 제네릭 타입의 타입 인수를 그대로 사용하곤 한다. 다음 예제에서는 기존 컬렉션의
                    첫 번째 요소부터 N번째 요소까지를 담고 있는 새로운 컬렉션을 반환하며, 정적으로 타이핑된
                    방식으로 동작하는 메서드를 구현한 예를 보여준다. 이전에는 이런 방식으로 코드를 구현할 수
                    없었다.


                     예제 2-5 컬렉션 내의 요소 중 일부만을 복사하는 예 ▶ GenericMethod.cs
                       public static List<T> CopyAtMost<T>(   타입 매개변수 T를 이용하여 메서드를 선언하고,
                           List<T> input, int maxElements)   메서드의 일반 매개변수와 반환 타입으로 활용
                       {
                           int actualCount = Math.Min(input.Count, maxElements);
                           List<T> ret = new List<T>(actualCount);    메서드 본문에서도 타입 매개변수를 사용
                           for (int i = 0; i < actualCount; i++)
                           {
                               ret.Add(input[i]);
                           }
                           return ret;
                       }


                       static void Main()
                       {
                           List<int> numbers = new List<int>();
                           numbers.Add(5);
                           numbers.Add(10);
                           numbers.Add(20);

                           List<int> firstTwo = CopyAtMost<int>(numbers, 2);   타입 매개변수로 int를 지정하여
                           Console.WriteLine(firstTwo.Count);           메서드를 호출
                       }

                                                                                                  065
   19   20   21   22   23   24   25   26   27   28   29