Java Comparable과 Comparator의 차이

김정훈·2024년 3월 31일
0

계기

항상 Comparable과 Comparator를 생각 없이 사용하다가 과제를 제출하는데 Comparator는 에러가 발생하고 Comparable은 정상작동하는 상황이 생겨 두 인터페이스의 차이에 대해 알아봤습니다.

무슨 차이?

파라미터

Comparable은 인자 1개 받고 this과 객체1을 비교하고 Comparator는 인자를 2개 받아서 객체1과 객체2를 비교합니다.

Comparable

  • 자기자신(this)와 객체1을 비교합니다.
  • 객체의 필드 속성에 대한 비교만을 대상으로 합니다.
    @Override
    public int compareTo(Point o) {
        double angle1 = calAngle(startPoint, this);
        double angle2 = calAngle(startPoint, o);
        if (angle1 < angle2) return -1;
        else if (angle1 > angle2) return 1;
        else return dist(this,o);
    }

Comparator

  • 자기자신이 아닌 객체1과 객체2를 비교합니다.
  • 필드 속성 외에 외부 속성에 대한 비교도 가능합니다.
  • 즉 비교 로직을 외부에 선언할 수 있습니다.
//객체 내부에 선언한 예시
    @Override
    public int compare(Point o1, Point o2) {
        double angle1 = calAngle(startPoint, o1);
        double angle2 = calAngle(startPoint,o2);
        if(angle1<angle2) return -1;
        else if(angle1>angle2) return 1;
        else return 0;
    }
// 객체 외부에 선언한 예시
// 객체 외부에 선언해도 Comparator<객체>를 선언하면 매핑이 가능한 것 같습니다.
public class PersonAgeComparator implements Comparator<Person> {
   @Override
   public int compare(Person p1, Person p2) {
       return Integer.compare(p1.getAge(), p2.getAge());
   }

   public static void main(String[] args) {
       List<Person> people = new ArrayList<>();
       people.add(new Person("John", 25));
       people.add(new P.....

알고 보니 CompareTo와 Compare라는 차이를 디테일하게 줬네요.

좀 더 명확히

객체를 Person으로 예를 들자면
Comparable은 대상 객체인 Person의 필드 속성만을 비교대상으로 합니다.
반면에 Comparator는 외부에 비교 로직을 선언할 수 있게 하여 Person 필드 뿐만 아니라 외부의 속성까지 비교대상으로 할 수 있습니다.

profile
백엔드 개발자

0개의 댓글