[C#] 8.2.5 IComparable 인터페이스와 IComparer 인터페이스

IComarable 인터페이스와 IComparer 인터페이스는 개체의 값 비교를 제공하기 위해 정의되었습니다. C#의 컬렉션은 대부분 Sort 메서드를 제공하는데 IComparable 인터페이스 기반의 요소를 보관하고 있을 때 정상적으로 동작하고 그렇지 않으면 예외를 발생합니다. 그리고 IComparer 개체를 입력 인자로 받는 Sort 메서드가 중복 정의되어 있는데 정렬하는 과정에서 입력 인자로 받은 IComparer 개체를 이용합니다.

또한, C#의 System에 정의되어 있는 기본 형식들은 ICompable 인터페이스를 기반으로 정의되어 있어서 기본 형식을 보관한 컬렉션은 Sort 메서드를 이용하여 정렬할 수 있습니다.

1차원 배열은 기반 클래스인 Array 추상 클래스의 정적 메서드인 Sort를 이용하여 정렬할 수 있습니다. Array 추상 클래스의 Sort는 1차원 배열을 입력 인자로 받습니다.

 

▶ 기본 형식을 요소로 하는 1차원 배열의 정렬

▶ 실행 결과

 

그리고 대부분의 컬렉션에는 Sort 메서드를 개체의 멤버로도 제공하고 있습니다.

▶ 기본 형식을 요소로 하는 ArrayList의 정렬

▶ 실행 결과

 

 

물론, 사용자가 형식을 정의할 때 IComparable 인터페이스 기반으로 정의하면 이러한 장점을 활용할 수 있습니다. ICompable 인터페이스에는 자신과 입력 인자를 비교하여 결과를 반환하는 CompareTo 메서드를 약속하고 있습니다. 입력 인자 형식을 object 형식으로 되어 있으므로 프로그램 목적에 맞게 예외 처리 등을 이용하여 적절히 처리해야 합니다.

▶ IComparbla에서 약속한 멤버

▶ 사용자 정의 형식 개체를 요소로 하는 컬렉션 정렬

▶ 실행 결과

 

프로그램에서 하나 이상의 정렬 기능을 제공할 때는 어떻게 할까요? 기본이 되는 값으로 비교하는 것은 IComparable 인터페이스에서 약속한 CompareTo에서 정의하면 되겠죠. 그리고 다른 값으로 비교를 원한다면 IComparer 인터페이스 기반의 형식을 정의하세요. Sort 메서드는 IComparer 개체를 입력 인자로 받는 메서드도 지원하고 있습니다.

▶ IComparer에서 약속한 멤버

IComparer 인터페이스에는 두 개의 개체를 입력 인자로 받는 Compare 메서드를 약속하고 있습니다. 결국 비교를 담당하는 부분을 별도의 형식으로 정의하는 것입니다.

▶ 회원 개체 이름과 주소로 정렬

▶ 실행 결과