Page 33 -
P. 33

이 예의 경우 T 타입 인수에 대한 제약 조건으로 IComparable<T> 인터페이스를 지정하고 있다. 이
               렇게 하면 IComparable<T>가 제공하는 CompareTo 메서드를 이용하여 items 항목으로 주어지는
               요소를 비교할 수 있으므로 정렬이 가능하다.

                 T first = ...;
                 T second = ...;
                 int comparison = first.CompareTo(second);

               어떤 코드를 작성하느냐에 달려 있겠지만, 내 경우에는 다른 제약 조건에 비해 타입 제약 조건으

               로 인터페이스를 비교적 많이 사용했다.
               여러 개의 타입 매개변수를 가지는 경우, 각각의 타입 매개변수별로 완전히 다른 제약 조건을 지
               정할 수도 있다.


                                                          TArg와 TResult라는 두 개의 타입 매개변수를
                 TResult Method<TArg, TResult>(TArg input)   가지는 제네릭 메서드
                     where TArg : IComparable<TArg>    TArg는 IComparable<TArg>를 구현해야 함
                     where TResult : class, new()    TResult는 참조 타입이면서 동시에 매개변수가 없는 생성자를 가져야 함


               쏜살같은 속도로 제네릭의 여러 측면을 모두 살펴봤다. 몇몇 주제는 이후에 추가적으로 설명할 기
               회가 있을 것이다. 다음으로 C# 2에 추가된 두 개의 타입 관련 연산자를 알아보자.




               2.1.6  default와 typeof 연산자


               사실 C# 1에도 typeof 연산자가 있긴 했지만, 그때는 피연산자로 타입만을 전달할 수 있었다. C#
               2에서는 typeof 연산자의 기능이 조금 확장되었고, 더불어 default 연산자가 추가되었다.

               default 연산자는 비교적 설명하기 쉽다. 이 연산자는 피연산자로 타입의 이름이나 타입 매개변
               수를 취하여 해당 타입의 기본값(default value)을 돌려준다. 이는 해당 타입으로 필드를 선언한 후,

               특별히 값을 할당하지 않았을 때에 필드가 가지는 값과 같다. 참조 타입이라면 기본값은 늘 null
               참조다. null 가능 값 타입을 제외한다면 모든 값이 0인 상태가 기본값이다(0, 0.0, 0.0m, false,
               내부 값이 0인 UTF-16 코드 등). null 가능 값 타입인 경우에는 null이 기본값이다.

               default 연산자의 피연산자로 제네릭 타입의 타입 매개변수를 지정할 수도 있다(당연한 이야기지
               만, 이 경우 적절한 타입 인수가 전달되어야 한다). 예를 들어 T라는 타입 매개변수를 사용하는 제
               네릭 메서드가 있다고 가정하면 다음과 같이 코드를 쓸 수 있다.




         074
   28   29   30   31   32   33   34   35   36   37   38