개발공부/C#

[Effective C#] 아이템 20 : IComparable<T>와 IComparer<T>를 이용하여 객체의 선후 관계를 정의하라

개발자 찐빵이 2021. 11. 26. 20:06
728x90

IComparable와 IComparer

객체의 선후 관계를 정의하기 위한 인터페이스
IComparable : 타입의 기본적인 선후 관계를 정의한다.
IComparable를 사용할 때는 IComparable도 함께 구현해야 한다.
IComparer : 기본적인 선후 관계 이외에 추가적인 선후 관계를 정의한다.
타입 내 관계 연산자를 재정의하면 해당 타입에 최적화된 방식으로 객체의 선후 관계를 판단할 수 있다. (효율성 증가)

CompareTo() 메서드란?

현재 객체가 대상 객체보다 작으면 0보다 작은 값을, 같으면 0을, 크면 0을 리턴하는 함수.
IComparable 인터페이스에 유일하게 정의되어있다.
IComparable 타입의 참조를 통해서만 호출된다.

IComparable의 단점

  • 인터페이스를 구현하기 위해 매개변수에 대한 타입을 런타임에 확인해야 한다.
  • 비교를 위해 박싱, 언박싱이 필요하므로 비교할 때마다 상당한 성능 비용이 발생한다.

IComparable 구현 시 중요한 점

명시적으로 인터페이스를 구현하고 추가적으로 강력한 타입의 public 오버로드 메서드를 함께 구현해야 한다.

강력한 타입의 오버로드 메서드를 사용하는 이유

  • 빠르게 비교 연산을 수행할 수 있다.
  • CompareTo 메서드의 오용 가능성도 줄일 수 있다.

결론

  • IComoparable과 IComparer는 타입에 선후 관계를 제공하기 위한 표준 메커니즘이다.
  • 기본적인 선후 관계는 IComparable을 통해 구현한다.
  • IComparable을 구현할 때는 관계 연산자도 함께 오버 로딩해서 일관된 결과를 제공해야 한다.
  • IComparable.CompareTo()는 System.Object 타입의 매개변수를 취하므로 별도로 오버 로딩된 메서드를 제공해야 한다.
  • 별도로 IComparer를 이용하면 추가적인 선후 관계를 정의할 수 있고, 직접 개발하지 않는 타입에 대해 임의의 선후 관계를 추가로 정의할 수 있다.
반응형