Java Comparable와 Comparator 이해

kimseungki·2022년 5월 17일
0

지식공유

목록 보기
1/3
post-thumbnail

이해하게 된 계기

코딩테스트 유형 중 그래프를 공부를 했었고, 당시 객체를 정렬을 할 필요가 있었다. 대부분 객체가 아닌 것들은 그냥 Arrays.sort(해당변수)로 해결이 되었는데 문제풀면서 객체 매개변수는 정렬을 하고싶은데 안되서 고민하다, 해당 내용숙지 부족을 깨닫게 되었다.
(여담) 회사에서 개발할 때 객체 데이터 정렬은 대부분 SQL(Order by..)에서 처리했다. 쓸일이 많이는 없었던거 같다..

내가 그전에 시도했던 방법

보통 String, int 등 2가지 데이터가 있으면 솔직히.. 그냥 배열 2개만들어서 어떻게든 끼워맞출려고 했었다..

Comparable과 Comparator 공통점

  1. 둘 다 똑같이 정렬관련 인터페이스인 점
  2. 리턴하는 변수가 int이고 양수 일 때(정렬순서 변경), 0이거나 음수일 경우(정렬순서 변경X)

Comparable와 Comparator 차이점

  1. Comparable는 해당 객체클래스에 implements를 통해 실행하고, compareTo 메소드를 Override처리하여, 매개변수 데이터와 객체 고유의 데이터를 비교하면서 처리한다.
  2. Comparator은 Arrays.sort 내에서 처리할 수 있으며 Comparable 인스턴스 생성 후, compare 메소드를 Override처리하여, 매개변수 객체 데이터를 비교하면서 처리한다.

예시1 (Comparable)

public class Node implements Comparable<E> {
    int number;
    String name;

    public Node(int number, String name) {
        this.number = number;
        this.name = name;
    }

    @Override
    public int compareTo(E e) {
    
    	/* this에 있는 것이 고유의 객체에 존재하는 int 변수
         만약 데이터가 this, E을 비교한다고 가정
        1(this) - 3(E) 은 -2(음수)이므로 정렬순서가 그대로
        6(this) - 3(E) 은 3(양수)이므로 정렬순서가 변경
        => 해당 데이터는 오름차순으로 정렬된다. 만약 이를 바꾸고 싶다면 
        this와 E의 자리를 바꾸면 내림차순이 된다.
        */
        
        return this.number - e.number;
        
    }
}

예시2 (Comparator)

        Arrays.sort(node, new Comparator<Node>() {
        
    	/* e1, e2를 통해 객체의 데이터 비교
        1(e2) - 3(e1) 은 -2(음수)이므로 정렬순서가 그대로
        6(e2) - 3(e1) 은 3(양수)이므로 정렬순서가 변경
        (e1, e2 였던 순서가 e2, e1으로 변경)
        => 해당 데이터는 내림차순으로 정렬된다. 만약 이를 바꾸고 싶다면 
        e2와 e1의 자리를 바꾸면 내림차순이 된다.
        */        
            @Override
            public int compare(Node e1, Node e2) {
                return e2.distance - e1.distance;
            }
        });

참고

Comparable(내림차순)와 Comparator(오름차순)으로 동시에 실행한다면
해당객체는 Comparator를 우선순위로 받아서 '오름차순' 으로 처리된다.

후기

처음엔 잘 이해가 안갔지만,
compare와 compareTo의 리턴값이 양수일때만 기존정렬 상태가 변경이 되고
compareTo일 때는 기존정렬 (고유의값(this), 매개변수의 객체 순) 상태를 변경할 것인가 아닌가?
compare일 때는 기존정렬 (비교객체1(e1), 비교객체2(e2) 순) 상태를 변경할 것인가 아닌가?
라고 생각을 하고 접근을 하니까 이해가 됬다.

profile
seung 기술블로그

0개의 댓글