Page 31 -
P. 31

2.1.5  타입 제약 조건


               제네릭 타입과 제네릭 메서드에 타입 매개변수를 포함시킬 때 타입 제약 조건(type constraint)을
               지정하면 타입 인수로 사용할 수 있는 타입의 종류를 제한할 수 있다. 컬렉션에 포함되어 있
               는 여러 요소를 출력할 때 스레드의 기본 컬처(culture) 대신 다른 컬처를 이용하여 포매팅을 수

               행할 수 있도록 메서드를 작성해야 한다고 가정해 보자. 이 경우 IFormattable 인터페이스의
               ToString(string, IFormatProvider)를 이용할 수 있다면 코드 작성이 한결 수월할 것이다. 만약
               컬렉션에 포함된 모든 요소가 이 인터페이스를 구현하고 있다고 가정한다면 출력 메서드를 다음
               과 같이 선언할 수 있다.


                 static void PrintItems(List<IFormattable> items)

               하지만 메서드의 원형을 이처럼 선언해 버리면 활용도가 극히 제한된다. 이 메서드에는 decimal
               타입이 IFormattable 인터페이스를 지원함에도 불구하고, List<decimal> 타입의 객체를 인수로

               전달할 수 없다. List<decimal> 타입은 List<IFormattable> 타입과 호환되지 않기 때문이다.

                 NOTE    그 이유는 4장에서 제네릭 변성을 다룰 때 좀 더 자세히 살펴볼 것이다. 지금은 단지 타입 제약 조건의
                 예로서 단순하게 생각해 주기 바란다.



               메서드의 원형을 통해 선언하고자 했던 것은 ‘IFormattable 인터페이스를 구현한 어떤 요소를 포
               함한 컬렉션’이다. 이 문장에서 ‘어떤 요소’라는 부분은 제네릭 메서드를 이용하여 표현할 수 있다.

               그리고 ‘IFormattable 인터페이스를 구현한’이라는 부분은 타입 제약 조건을 이용하여 표현할 수
               있다. 다음과 같이 메서드의 선언부에 where 절을 추가하여 코드를 작성하면 된다.

                 static void PrintItems<T>(List<T> items) where T : IFormattable


               이처럼 T에 대해 타입 제약 조건을 지정하면 메서드에 어떤 타입을 전달할 수 있는지에 대해서도
               영향을 주지만, T 타입으로 무엇을 할 수 있는지에 대해서도 영향을 미친다. 이제 컴파일러는 T 타
               입이 적어도 IFormattable 인터페이스를 구현하고 있다고 가정할 수 있으므로, 메서드의 본문에
               서 T 타입의 객체를 이용하여 IFormattable.ToString(string, IFormatProvider)를 호출하는 것

               을 허용해 준다.








         072
   26   27   28   29   30   31   32   33   34   35   36