[Java] Comparable vs Comparator

박성우·2023년 7월 12일
0

Java

목록 보기
4/6

Comparable와 Comparator 인터페이스는 무슨 차이가 있고 어떻게 쓰이는 지 간단하게 정리하려고 한다.

우선 Comparable와 Comparator는 정렬에 사용되는데, 객체의 정렬 기준을 정해주고자 사용된다.

예를 들어, int 배열이 존재한다고 하면 Arrays.sort()만 써주면 알아서 오름차순으로 정렬이 된다.

그런데, 객체 배열을 정렬하려고 한다면 어떻게 정렬해야할까?

객체는 필드를 여러 개 가질 수 있기 때문에, 어떤 필드를 비교해서 정렬할 것인지, 정렬 기준이 필요하다.

그 정렬 기준을 정하는 방법이 Comparable와 Comparator를 이용하는 것이다.

Comparable와 Comparator에 대한 내용은 찾아보면 굉장히 많으니 간단한 차이과 사용법만 정리하겠다.

Comparable

compareTo 메소드를 오버라이딩해서 자기 자신과 다른 객체를 비교

public class Student implements Comparable<Student> {
	private int score;
    ...

    @Override
    public int compareTo(Student o) {
        return this.score - o.getScore();
    }
}

// Arrays.sort(students)
// Collections.sort(students);

이렇게 인터페이스를 구현하고 compareTo 메소드를 오버라이딩하면 sort() 가 호출되면서 정렬 기준과 함께 정렬된다.

Comparator

compare 메소드를 오버라이딩해서 다른 두 객체를 비교

Comparator 사용법은 다음과 같이 사용 가능하다.

public class ScoreSort implements Comparator<Student> {
    ...

    @Override
    public int compare(Student o1, Student o2) {
        return o1.getScore() - o2.getScore();
    }
}

// ScoreSort scoreSort = new ScoreSort();
// Arrays.sort(students, scoreSort)
// Collections.sort(students, scoreSort);

인터페이스를 구현하고 compare 메소드를 오버라이딩한 객체를 인자로 넣어주면 된다.

하지만 자기 자신과 비교하느냐, 아니면 다른 두 객체를 비교하느냐의 차이로부터 사용법에 큰 차이가 발생한다.

Comparable은 자기 자신과 비교해야 하기 때문에 인터페이스를 구현해서 compareTo 메소드를 오버라이딩 해야하고, 그로 인해 sort() 의 인자로 들어갈 수 없으며, 다른 두 객체를 비교하는 Comparator만 인자로 받고 있다.

그렇기 때문에, Comparator를 익명 객체로 구현해서 손쉽게 구현이 가능하다.

Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getScore() - o2.getScore();
            }
        });

이런 식이다.

심지어, Comparator는 추상메소드를 하나만 가지고 있는 함수형 인터페이스이기 때문에, 위 식을 람다식으로 더 간편하게도 구현이 가능하다.

Arrays.sort(students, (o1, o2) -> o1.getScore() - o2.getScore());

Comparable 인터페이스는 정렬 기준이 자기 자신이므로, 애초에 sort() 의 인자로 들어갈 수 없기 때문에 익명 객체 또는 함수형 인터페이스를 통한 람다식으로 표현을 통한 간편화 또한 할 수 없다.

애초에 적용 기준이 다르긴 하지만, 객체 자체에 정렬 기준을 부여하고 지속적으로 쓰고 싶다면 Comparable을 구현하는게 적합하고, 그게 아니라면 Comparator를 이용하는 것이 그때 그때 정렬 기준을 정해주는 것이 훨씬 간편하다고 본다.

profile
Backend Developer

0개의 댓글