본문 바로가기
프로그래밍

IComparer를 이용한 개체 비교

by minimax95 2020. 7. 8.

이전 포스팅에서는 object를 바이너리로 변환하여 개체를 비교하거나 object의 ReferenceEquals( ) 함수를 이용한 비교 방법에 대해서 알아보았습니다. 이번 포스팅에서는 순수하게 IComparer를 이용해서 두 개체를 비교하는 방법에 대해서 알아보겠습니다.

 

IComparer Interface는 두 개체를 비교하는 Compare( ) 메서드를 구현해야 합니다.

Compare( ) 함수의 리턴 값으로 만약 Compare(a, b)의 리턴 값을 구하고자 한다면 아래의 표와 같이 3가지 결괏값을 반환합니다.

Compare(a, b) 리턴값 결 과 사용 예
-1 b가 a 보다 작을 경우  if(a > b) b가 a 보다 작은 조건
 return -1
1 b가 a 보다 클 경우 if(a < b) b가 a보다 큰 조건 
return 1
0 a, b가 서로 같을 경우 같은 경우 return 0

 

예제로 살펴보겠습니다.

문자열 배열을 선언하고 Array 클래스의 Sort( )함수를 이용한 일반 정렬과 IComparer 인터페이스를 구현한 ReverserClass를 정의하여 문자열 배열을 역순으로 정렬되도록 하는 예제를 만들어 보겠습니다.

IComparer 인터페이스를 사용하기 위해서는 'using System.Collections'가 필요합니다.

public class ReverserClass : IComparer

{

    int IComparer.Compare(Object x,  Object y)

    {

        return new CaseInsensitiveComparer( )).Compare(y, x);

    }

}

CaseInsensitiveComparer 클래스는 두 문자열 개체가 같은지 비교하는 클래스로 IComparer를 상속받은 클래스입니다.

다음은 결과값을 출력할 수 있도록 인덱스와 값을 차례로 인쇄하는 함수를 만들어 줍니다.

public static void PrintIndexAndValues(IEnumerable list)

{

    int i = 0;

    foreach (var item in list )

    {

        Console.WriteLine($" [{i++}]: {item}");

    }

    Console.WriteLine();    // 인쇄 종료 후 한 줄 띄우기

}

 

콘솔앱 Main에서 아래와 같이 string 배열을 선언하고 임의의 단어들을 넣어 줍니다.

public static void Main()

{

    // 임의의 단어 배열

    string[] words = { "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };

 

    // 초기화된 배열 인쇄

    Console.WriteLine("words 배열 초기화 값 출력" );

    PrintIndexAndValues(words);

 

    // Array.Sort( ) 함수를 이용한 정렬

    Array.Sort(words);

    Console.WriteLine("순차 정렬시킨 배열 인쇄" );

    PrintIndexAndValues(words);

 

    // 역순으로 정렬하여 인쇄

    Array.Sort(words, new ReverserClass());

    Console.WriteLine("역순 정렬 후 인쇄");

    PrintIndexAndValues(words);

}

 

그럼 위 소스코드를 빌드하여 실행시켜 보겠습니다.

Array.Sort( ) 함수의 두 번째 인자로 우리가 정의한 ReverserClass 객체를 넣어주면 두 개체를 비교하는 과정을 수행하여 역순으로 정렬된 배열을 출력할 수 있습니다.

 

이상으로 IComparer를 이용한 개체 비교 및 사용법에 대해 알아보았습니다.

감사합니다.

댓글