Page 32 -
P. 32

예제 2-6 타입 제약 조건을 설정하여 컬렉션 내의 요소들을 InvariantCulture를 이용하여 출력하는 예 ▶ TypeConstraints.cs
                       static void PrintItems<T>(List<T> items) where T : IFormattable
                                                                                                      2
                       {
                           CultureInfo culture = CultureInfo.InvariantCulture;
                           foreach (T item in items)                                                  C# 2
                           {
                               Console.WriteLine(item.ToString(null, culture));
                           }
                       }


                    타입 제약 조건을 지정하지 않았다면, 이 예와 같이 컬처를 인자로 취하는 ToString 메서드를 사
                    용할 수 없었을 것이다. 타입 제약 조건이 없다면 컴파일러가 이해하는 T는 그저 System.Object

                    타입일 뿐이며, 이 경우 System.Object 타입 내의 ToString만을 알고 있을 뿐이다.

                    타입 제약 조건으로는 인터페이스 외에 몇 가지 다른 종류의 제약 조건도 지정할 수 있다.

                       ●   참조 타입 제약 조건: where T : class. 타입 인수는 참조 타입이어야 한다(class 키워드에
                         속지 말라. 이 경우 T는 인터페이스, 델리게이트 등 어떤 참조 타입도 될 수 있다).

                       ●   값 타입 제약 조건: where T : struct. 타입 인수는 null 가능 타입이 아닌 값 타입이어야 한
                         다(struct 혹은 enum). null 가능 값 타입은(2.2절에서 다룰 예정이다.) 이 제약 조건에 부
                         합하지 않는다.

                       ●   생성자 조건: where T : new(). 타입 인수는 매개변수가 없는 생성자를 가져야 한다. 이 제
                         약 조건을 사용하면 본문에서 new T()와 같은 코드를 통해 T 타입의 객체를 생성할 수 있다.

                       ●   변환 조건: where T : SomeType. 여기서 SomeType은 다음 예와 같이 클래스, 인터페이스 혹
                         은 다른 타입 매개변수가 될 수 있다.

                         •  where T : Control
                         •  where T : IFormattable

                         •  where T1 : T2

                    여러 제약 조건을 조합해서 사용하다 보면 코드가 너무 복잡해질 가능성이 있다. 다행히도 대부분
                    의 경우 문제가 발생하더라도 컴파일러의 오류 메시지를 통해 어떤 규칙을 위반했는지 쉽게 알아
                    차릴 수 있다.

                    매우 흥미롭고 의미 있는 활용 예로서, 제약 조건 내에 타입 매개변수를 두는 방법을 살펴보자.

                       public void Sort(List<T> items) where T : IComparable<T>


                                                                                                  073
   27   28   29   30   31   32   33   34   35   36   37