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를 이용하면 추가적인 선후 관계를 정의할 수 있고, 직접 개발하지 않는 타입에 대해 임의의 선후 관계를 추가로 정의할 수 있다.
반응형
'개발공부 > C#' 카테고리의 다른 글
[Effective C#] 아이템 22 : 공변성과 반공변성을 지원하라 (0) | 2021.11.28 |
---|---|
[Effective C#] 아이템 21 : 타입 매개변수가 IDisposable을 구현한 경우를 대비하여 제네릭 클래스를 작성하라 (0) | 2021.11.27 |
[Effective C#] 아이템 19 : 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라 (0) | 2021.11.25 |
[Effective C#] 아이템 18 : 반드시 필요한 제약 조건만 설정하라 (0) | 2021.11.24 |
[Effective C#] 아이템 17 : 표준 Dispose 패턴을 구현하라 (0) | 2021.11.23 |