728x90
제약 조건을 사용하는 이유
타입 매개변수로 어떤 타입을 지정할 것인지 추가 정보가 제공되어 있지 않을 때, 컴파일러는 System.Object가 제공하는 기능만 사용할 수 있다.
그런데 제약 조건을 설정하면 컴파일러는 System.Object에 정의된 public 메서드보다 더 많은 것을 타입 매개변수에 기대할 수 있다.
제약 조건의 장점
- 제네릭 타입을 잘못 사용하는 경우 컴파일러가 그 사실을 알려줄 수 있다.
- 런타임 오류를 줄일 수 있다.
- 오용 가능성을 낮출 수 있다.
제약 조건이 컴파일러에게 주는 도움
- 컴파일러는 타입 매개변수로 전달된 타입이 제약 조건으로 설정한 기능을 모두 구현하고 있을 것이라고 가정할 수 있다.
- 컴파일러는 제네릭 타입을 사용하는 사용자가 타입 매개변수로 올바른 타입을 지정했는지 컴파일 타입에 확인할 수 있다.
제약 조건 설정 예시
IComparable
public static bool AreEqual<T>(T left, T right){
where T : IComparable<T> => //여기 where이 제약조건
left.CompareTo(right) == 0;
}
위 코드에서 알 수 있는 제약 조건의 장점
- 런타임에 발생 가능성이 있는 오류를 컴파일 타임에 확인할 수 있다.
- 코드가 매우 짧다.
- 런타임 오류가 발생하지 않는다.
제약 조건을 과도하게 설정하는 것은 좋지 않다.
타입 매개변수에 제약 조건을 많이 설정하면 제네릭 타입을 사용하는 것이 큰 부담이 된다.
제약 조건을 최소화하는 방법
- 제네릭 타입 내에서 반드시 필요한 기능만 제약 조건으로 설정하기
- 런타임에 특정 인터페이스나 특정 베이스 클래스를 상속한 타입인지 확인 후 사용하기.
제약 조건 설정 기준
개선된 메서드를 사용하려 시도하기.
불가능한 경우에는 한 단계 낮은 수준의 메서드 호출하기.
기본 기능을 제공하는 메서드 외의 자체적으로 구현한 메서드 오버로드하기.
반응형
'개발공부 > C#' 카테고리의 다른 글
[Effective C#] 아이템 20 : IComparable<T>와 IComparer<T>를 이용하여 객체의 선후 관계를 정의하라 (0) | 2021.11.26 |
---|---|
[Effective C#] 아이템 19 : 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라 (0) | 2021.11.25 |
[Effective C#] 아이템 17 : 표준 Dispose 패턴을 구현하라 (0) | 2021.11.23 |
[Effective C#] 아이템 7 : 델리게이트를 이용하여 콜백을 표현하라 (0) | 2021.11.22 |
[Effective C#] 아이템 6 : nameof() 연산자를 적극 활용하라 (0) | 2021.11.21 |