🌍 C# Study/이펙티브 C#
[20] IComparable<T>와 IComparer<T>를 이용하여 객체의 선후 관계를 정의하라
맨텀
2021. 4. 26. 22:21
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.
.NET Framework는 객체의 선후 관계를 판단할 수 있는 IComparable<T>와 IComparer<T>를 제공한다.
더불어 C#은 타입 내의 관계 연산자 (<, >, <=, >=)를 재 정의하여 선후 관계를 판단할 수 있다.
IComparable, IComparable<T>
- 하나의 메서드만 정의되어있다.
- 객체가 대상 객체보다 작으면 0보다 작은 값을, 같으면 0, 크면 0보다 큰 값을 반환한다.
public interface IComparable
{
int CompareTo(object obj);
}
IComparer, IComparer<T>
- 하나의 메서드만 정의되어있다.
- x가 y보다 작다면 0보다 작은 값을, 같으면 0, 크면 0보다 큰 값을 반환한다.
public interface IComparer
{
int Compare(object x, object y);
}
관계 연산자 재정의
- 관계 연산자 내부에서 CompareTo를 호출하도록 재정의 하면 선후 비교가 보다 쉬워진다.
public class A : IComparable<A>
{
private readonly string name;
public int CompareTo(A other)
{
return name.CompareTo(other.name);
}
public static bool operator <(A left, A right)
=> left.CompareTo(right) < 0;
public static bool operator <=(A left, A right)
=> left.CompareTo(right) <= 0;
public static bool operator >(A left, A right)
=> left.CompareTo(right) > 0;
public static bool operator >=(A left, A right)
=> left.CompareTo(right) >= 0;
}
결론
IComparable과 IComparer를 구현하여 객체의 선후관계를 정의하자.