04
26
다음 본문은 도서 이펙티브 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를 구현하여 객체의 선후관계를 정의하자.

 

 

COMMENT