Java - Comparable, Comparator

JeongHoHyun·2025년 1월 7일

Java

목록 보기
15/23

Comparable, Comparator

  • Java의 객체를 정렬할때 사용되는 인터페이스이다.

Comparable

  • 패키지 : java.lang.Comparable
  • 목적 : 객체 자체에 기본 정렬 기준을 정의한다.
  • 사용 방법 :
    • 정렬이 필요한 클래스에 Comparable 인터페이스를 구현하고, CompareTo 메서드를 오버라이드 하여 정렬 기준을 정의한다.
    • 정렬은 Collections.sort() 또는 Arrays.sort() 메서드를 사용하여 이루어진다.
package collection.compare;

public class MyUser implements Comparable<MyUser> {
    private String id;
    private int age;

    public MyUser(String id, int age) {
        this.id = id;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "MyUser{" +
                "id='" + id + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(MyUser o) {
        return this.age < o.age ? -1 : this.age == o.age ? 0 : 1;
    }
}

Comparator

  • 패키지 : java.util.Comparator
  • 목적 : 객체 외부에서 정렬 기준을 정의한다.
  • 사용 방법 :
    • 정렬 기준을 별도의 클래스에서 정의하거나, 익명 클래스 또는 람다식을 사용한다.
    • 다양한 정렬 기준을 유연하게 정의할 수 있다.
    • Collections.sort() 또는 List.sort() 등에 커스터 마이징 가능
package collection.compare;

import java.util.Comparator;

public class IdComparator implements Comparator<MyUser> {
    @Override
    public int compare(MyUser o1, MyUser o2) {
        return o1.getId().compareTo(o2.getId());
    }
}

공통

package collection.compare;

import java.util.Arrays;

public class SortMain3 {
    public static void main(String[] args) {
        MyUser myUser1 = new MyUser("a", 30);
        MyUser myUser2 = new MyUser("b", 20);
        MyUser myUser3 = new MyUser("c", 10);

        MyUser[] array = new MyUser[]{myUser1, myUser2, myUser3};
        System.out.println("기본 데이터");
        System.out.println(Arrays.toString(array));

        Arrays.sort(array);
        System.out.println(Arrays.toString(array));

        // 추가
        System.out.println("IdComparator 정렬");
        Arrays.sort(array, new IdComparator());
        System.out.println(Arrays.toString(array));

        System.out.println("IdComparator.reverse 정렬");
        Arrays.sort(array, new IdComparator().reversed());
        System.out.println(Arrays.toString(array));
    }
}

Comparable VS Comparator

  • Comparable은 객체의 "기본 정렬 기준"을 정의할 때 사용한다.
    • ex) 한 가지 정렬 기준만 필요할 때
  • Comparator는 "다양한 정렬 기준"이 필요하거나, 객체 외부에서 정렬 기준을 관리하고 싶을 때 사용한다.

주의!

  • 만약 Comparable도 구현하지 않고, Comparator도 제공하지 않으면 다음과 같은 런타임 오류가 발생한다.

    java.lang.ClassCastException: class collection.compare.MyUser cannot be cast to class java.lang.Comparable

  • Comparator가 없으니, 객체가 가지고 있는 기본 정렬을 사용해야하는데 Comparable도 없기 때문에 예외가 발생한다.
profile
Java Back-End 2022.11.01 💻~ing

0개의 댓글