개발공부/C#

[Effective C#] 아이템 18 : 반드시 필요한 제약 조건만 설정하라

개발자 찐빵이 2021. 11. 24. 19:31
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;
}

위 코드에서 알 수 있는 제약 조건의 장점

  • 런타임에 발생 가능성이 있는 오류를 컴파일 타임에 확인할 수 있다.
  • 코드가 매우 짧다.
  • 런타임 오류가 발생하지 않는다.

제약 조건을 과도하게 설정하는 것은 좋지 않다.

타입 매개변수에 제약 조건을 많이 설정하면 제네릭 타입을 사용하는 것이 큰 부담이 된다.

제약 조건을 최소화하는 방법

  1. 제네릭 타입 내에서 반드시 필요한 기능만 제약 조건으로 설정하기
  2. 런타임에 특정 인터페이스나 특정 베이스 클래스를 상속한 타입인지 확인 후 사용하기.

제약 조건 설정 기준

개선된 메서드를 사용하려 시도하기.
불가능한 경우에는 한 단계 낮은 수준의 메서드 호출하기.
기본 기능을 제공하는 메서드 외의 자체적으로 구현한 메서드 오버로드하기.

반응형