본문 바로가기
츄Log/기타 끄적

헷갈리는 compare/compareTo 이해하기

by 츄츄🦭 2023. 12. 9.
728x90

 

안녕하세요!

 

JAVA에서는 객체간 비교를 하기 위해 Comparable/Comparator 인터페이스를 많이 사용합니다. 

단순 객체간 비교를 할 때는 어렵지 않은데, 정렬에서 이 인터페이스의 compareTo를 구현할 때는 구현할 때마다 헷갈리는 것 같습니다.

(머리가 좋으신 분들은 헷갈리지 않을 수 있습니다..)

 

더이상 헷갈리면 안되겠다 싶어서 핀 선생님의 도움을 받아 차근히 공부를 했고, 오늘은 제가 이해한 방법을 한 번 공유해볼까 합니다. 

Comparator javaDoc

 

외워야할 것들

  1. 비교대상 : A, B
  2. 공식 : A를 기준으로 A를 앞에 보내고 싶으면 -1, A를 뒤로 보내고 싶으면 1 (같으면 0 이지만 이건 딱히 헷갈리지 않으니 제외)
  3. 오름차순 : 작은 수가 앞에 옴 / 내림차순 : 큰 수가 앞에 옴 
  4. point : 함수가 완성되기 전까지는 순서가 정해진게 아니므로 대소비교 경우의 수를 모두 구현해줘야 하고, Comparable인 경우 A는 this가 됩니다.

이 네 가지를 기억해두고 compareTo를 구현해보겠습니다.

// 1. 오름차순 : 오름차순은 작은 수가 앞에 옵니다.
public int compare(final Integer a, final Integer b) {
	if (a > b) {	// 만약 a가 b보다 크다면, 뒤로 가야 합니다.
    	return 1;	// a를 뒤로 보내고 싶으면 1 
    }
    
    if (a < b) {	// 만약 a가 b보다 작다면, 앞으로 오면 됩니다.
    	return -1;	// a를 앞으로 보내고 싶으면 -1
    }
    
    return 0;
}

// 2. 내림차순 : 내림차순은 큰 수가 앞에 옵니다.
public int compare(final Integer a, final Integer b) {
	if (a > b) {	// 만약 a가 b보다 크다면, 앞으로 와야 합니다.
    	return -1;	// a를 앞으로 보내고 싶으면 -1 
    }
    
    if (a < b) {	// 만약 a가 b보다 작다면, 뒤로 가야 합니다.
    	return 1;	// a를 뒤로 보내고 싶으면 1
    }
    
    return 0;    
}

 

많은 라이브러리들이 이를 뺄셈으로 구현하고 있어서 헷갈리지만, 기본적인 개념은 이렇습니다.

이걸 이해하면 뺄셈을 이해하는 것도 매우 쉬울거리라 생각합니다.

(제가 이해했으면 이걸 보는 분들은 무조건 이해하실 겁니다.) 

 

뺄셈을 이용해서 구현해보겠습니다.

// 1. 오름차순 : 오름차순은 작은 수가 앞에 옵니다.
public int compare(final Integer a, final Integer b) {
    return a - b;	// a > b가 양수고 / a < b가 음수임을 보장해주는 식
}

// 2. 내림차순 : 내림차순은 큰 수가 앞에 옵니다.
public int compare(final Integer a, final Integer b) {
	// 오름차순의 reverse
	// -(a - b)
	// -a + b
	// b - a
    return b - a; // a > b가 음수고 / a < b가 양수임을 보장해주는 식
}

 

간단한게 끝났습니다.

참 쉽죠? ㅎㅎ


혹시 궁금한 게 있다면 댓글 남겨주세요 :) 

728x90