Java

[Java] Comparator와 Comparable

Hyeonni 2022. 9. 14. 15:11

Arrays.sort()는 기본으로 오름차순 정렬을 해준다. 오름차순 정렬이 가능한 이유는 Character 클래스의 comparable을 오름차순으로 정렬하도록 구현했기 때문이다. Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다. Comparable을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들(Wrapper 클래스, String, Date, File)과 같은 것들이며 기본적으로 오름차순으로 정렬되도록 구현되어 있다. 즉, Comparable을 구현한 클래스는 정렬이 가능하다는 것을 의미한다.

 

  • Comparable : 기본 정렬 기준을 구현하는 데 사용한다. java.lang 패키지에 존재한다.
  • Comparator : 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용한다. java.util 패키지에 존재한다.

즉, Comparable을 구현한 클래스들이 기본적으로 오름차순으로 정렬되어 있지만, 내림 차순 등 다른 기준으로 정렬하고 싶을 때 Comparator를 구현해서 정렬 기준으로 넘겨주면 된다.

 

 

compare()과 compareTo()는 두 객체를 비교하는 같은 기능을 한다. 둘 다 두 객체를 비교해서 값이 작은 경우 음수, 0, 값이 큰 경우 양수 중의 하나를 반환한다.

equals()는 모든 클래스가 가지고 있는 공통적인 메서드이지만 Comparator를 구현하는 클래스는 오버 라이딩이 필요할 수도 있다는 것을 알리기 위해서 정의한 것이기 때문에 필수로 구현하지 않아도 된다.

 

위 코드는 String의 기본 정렬을 반대인 내림차순으로 정렬하도록 구현한 코드이다. 이 코드에서 주의할 점은 매개변수가 Object 타입이기 때문에 compareTo()를 바로 호출 할 수 없기 때문에 명시적으로 형변환을 해주어야 한다는 점이다.

 

아래 코드는 String을 비교할 때 대소문자를 구분하지 않고 비교하는 Comparator를 상수의 형태로 정의해 둔 것으로 유용하게 사용할 수 있다.

public static final Comparator CASE_INTENSITIVE_ORDER

 

적용 할 때는 아래 코드처럼 두 번째 인자로 넘겨서 사용하면 된다.

 

 


자바의 정석(남궁성)을 정리한 내용입니다.