본문 바로가기
Language/자바

Comparable 과 Comparator 인터페이스의 차이는 무엇인가?

by 띵커베르 2023. 2. 14.
728x90
  • 두 인터페이스 모두 public 접근 변경자로 선언하기 때문에 모든 용도로 자료를 담을 수 있다.
  • Comparable 인터페이스는 자연스러운 순서로 정렬할 때 사용하고, Comparator 는 원하는 대로 정렬 순서를 지정하고 싶은 곳에 사용한다.
  • 배열을 정렬할 때는 일반적으로 Array나 Collectio 클래스에 내장된 라이브러리를 이용한다.
  • Array와 Collection 클래스는 몇 가지 오버로딩된 정렬 메서드가 있다.크게 배열을 매개변수로 받는 메서드와 배열을 Comparator 객체를 매개변수로 받는 서드의 두 가지로 분류된다. 그리고 각각의 원시타입 과 참조타입에 관한 객체를 오버로드 한다.
  • Comparator 객체가 없는 구현체는 타입을 자연스런 순서로 정렬한다.
    @Test
    void sortInts() {
        final int[] numbers = {-3, -5, 1, 7, 4, -2};
        final int[] expected = {-5, -3, -2, 1, 4, 7};

        Arrays.sort(numbers);
        assertThat(numbers).isEqualTo(expected);
    }

    @Test
    void sortObjects() {
        final String[] strings = {"z", "x", "y", "abc", "zzz", "zazzy"};
        final String[] expected = {"abc", "x", "y", "z", "zazzy", "zzz"};
        Arrays.sort(strings);
        assertThat(strings).isEqualTo(expected);
    }
  • 지정한 순서대로 정렬하고 싶으면 sort 메서드에서 사용할 Comparator 인터페이스를 구현한 후 이를 sort 메서드에 제공해야 한다.
  • 이를 위해 Comparator 인터페이스에는 자료형 T 를 구현하는 int compare(T o1, T o2)와 boolean equals (Object o) 라는 두 가지 메서드가 있다.
  • Compare 메서드는 양수, 0, 음수라는 세 가지 상태 중 하나로 int 타입의 값을 반환한다.
    • 두 번째 매개변수 앞에 첫 번째 매개변수가 오면 음수 값, 두 개의 매새변수가 같으면 0, 두 번째 매개변수가 첫 번째 매개변수보다 앞에 오면 양수 값을 반환한다.
  • 아래는 Comparator 인터페이스를 사용해 역순으로 정렬한 코드
    @Test
    void customSorting() {
        final List<Integer> numbers = Arrays.asList(4, 7, 1, 6, 3, 5, 4);
        final List<Integer> expected = Arrays.asList(7, 6, 5, 4, 4, 3, 1);

        Collections.sort(numbers, new ReverseNumericalOrder());
        assertThat(numbers).isEqualTo(expected);
    }

    public class ReverseNumericalOrder implements Comparator<Integer> {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2 - o1;
        }
    }

 

728x90

댓글