주니어 개발자 성장기

Comparable과 Comparator 본문

Java

Comparable과 Comparator

Junpyo Lee 2023. 7. 15. 17:01

개요

Comparable과 Comparator은 둘다 interface로서 Comparable은 자기 자신과 매개변수 객체를 비교하는 것이고 Comparator는 두 매개변수 객체를 비교하는 것이다.

 

공통점

둘 다 int 값을 반환한다. 반환 값이 양수인 경우, 앞의 객체(Comparable의 경우 this)가 순서상으로 뒤로 위치하게 된다. 0은 동등함을 의미하며 음수인 경우, 두 객체의 순서가 바뀌지 않는다.

 

 

 

 

 

 

Comparator

Comparator 는 자연스러운 순서가 없는 개체 컬렉션에 대한 순서를 제공하는 비교 기능으로서, 이 클래스의 구현체는 compare()override해야 한다. 앞서 말했듯 compare(Object A, Object B)와 같이 두 개의 인자를 받아서 int 값을 반환한다. 두 개의 매개 변수를 비교하는 것이다.

 

 

람다

람다 표현식으로 간결하게 사용할 수 있다.

Collections.sort(list, (a, b) -> a - b);

 

사용처

순서 정렬이 필요한 경우에 인자로서 전달하는 방식으로 사용된다.

  1. Collections.sort()
  2. PriorityQueue<>()

 

 

 

Comparable

Comparable은 자기 자신과 다른 객체를 비교하는 interface다. compareTo(Object A)로 한 개의 매개변수를 받아 this와 비교해 int 값을 반환한다. 즉, Comparable 인터페이스를 적용하기 위해서는 비교하고자 하는 객체의 클래스가 Comparable를 구현하고 있어야 한다.

 

 

 

 

 

 

 

왜 비교 인터페이스가 2개나 존재할까?

Comparable은 어떤 객체의 기본 순서를 지정하는데 쓰일 수 있다.반면 Comparator를 사용하는 이유는 3가지가 있다.

  1. 정렬하고자 하는 대상의 소스코드를 직접 수정할 수 없는 경우
  2. 정렬하고자 하는 대상 클래스의 비교 코드(Comparable)을 추가하고 싶지 않을 때
  3. 여러 가지 정렬 전략을 세우려고 할 때(Comparable은 1개만 가능)

 

사용시 유의점

위와 같이 return a - b와 같이 구현한다면 오버플로우가 발생할 수 있으므로 큰 숫자를 다룰 때는 다음과 같이 구현하는 것이 좋다. (자세한 내용은 Baeldung에서 확인하는 것을 추천한다.)

@Override
public int compare(Integer a, Integer b) {
    if (a > b)
        return 1;
    else if (a == b)
        return 0;
    return -1;
}

 

 

 

 

 

 

참고: Comparator and Comparable in Java | Baeldung

'Java' 카테고리의 다른 글

함수형 인터페이스  (0) 2023.08.07
(22.09.08)Java는 call by reference를 쓰지 않는다.  (0) 2022.09.08