JH 개발 블로그
Java compareTo(), compare()의 차이와 내림차순, NaN값 처리 본문
코딩을 할때 내림차순 정렬, 객체 비교 등을 위해 정렬을 직접 구현할 때가 많다.
오늘은 Comparable 인터페이스의 compareTo 메소드와 Comparator 인터페이스의 compare 메소드의 차이를 정리해보려 한다.
기본적으로 정렬을 구현할 때 Comparable 인터페이스 또는 Comparator 인터페이스의 메소드를 재정의 할 수 있다.
Comparable의 compareTo는
@Override
public int compareTo(Stage o) {
if (failure < o.failure) {return -1;}
else if (failure > o.failure) {return 1;}
else return 0;
}
현재 객체에서 파라미터 객체 o와 비교를 한다.
Stage 클래스는 예시를 위해서 임의로 만든 클래스이다. Stage 객체에는 failure 라는 필드가 있다.
만약 failure 값을 기준으로 두 객체의 크기를 비교판단 하고 싶다면 위와 같이 메서드를 정의하면 된다.
여기서 리턴값이 중요하다.
음수 : 타 원소가 크다.
0 : 두 원소가 같다.
양수 : 자신이 크다.
간단하다. 메소드 재정의를 통해 원하는 필드값으로 현재 객체와 타 객체(파라미터)를 비교하고 리턴값을 통해 무엇이 더 큰지 비교판단이 가능하다.
이제 Comparator의 compare를 보자.
@Override
public int compare(Stage o1, Stage o2) {
if (o1.failure < o2.failure) {
return 1;
} else if (o1.failure > o2.failure) {
return -1;
} else return 0;
}
compare는 하나의 파라미터가 아닌 두개의 파라미터를 받아서 서로 비교를 한다.
여기서도 리턴값을 보면
음수 : o1이 o2보다 작다.
0 : 두 원소가 같다.
양수 : o1이 o2보다 크다.
위 메소드에서는 내림차순 정렬을 위해 리턴값의 부호를 반대로 주었다.
o1.failure가 o2.failure보다 작을때, 리턴값으로 양수를 줘서 o1.failure가 더 크다고 판단하도록 하였다.
반대로 o1.failure가 o2.failure보다 클때, 리턴값으로 음수를 줘서 o1.failure가 더 작다고 판단하도록 하였다.
정렬은 기본적으로 올림차순이다. 하지만 이렇게 메소드를 재정의 한 Comparator로 정렬(sort)을 하면, 올림차순이 아닌 내림차순으로 정렬이 된다. 정렬 과정에서 o1.failure가 실제로는 더 작지만 리턴값이 양수이므로 더 크다고 인식해, 위치가 바뀌는 것이다.
compareTo, compare 의 메소드를 구현할 때 조심해야 할 점이 있다.
바로 NaN 값의 처리이다.
NaN 값은 어떤 값과 비교하든 비교판단에서 무조건 false를 내뱉는다.
따라서 if, else if문을 지나 무조건 else문에서 처리된다.
만약 NaN을 가지고 있는 리스트를 정렬할 때, NaN을 원래 인덱스에 그대로 두고 싶다면 else의 리턴값을 0으로 두면 된다.
하지만 아래 코드와 같이
@Override
public int compare(Stage o1, Stage o2) {
if (o1.failure < o2.failure) {
return 1;
} else if (o1.failure == o2.failure) {
return 0;
} else return -1;
}
else문의 리턴값이 -1이라면 NaN 값은 항상 작다고 판단되어 리스트의 맨 앞에 위치하게 될것이다.
'JAVA' 카테고리의 다른 글
SpringBoot static 변수에 @value 사용 (0) | 2025.01.17 |
---|---|
JPA - SELECT 보다 UPDATE 쿼리가 먼저 나가는 이유 (flush, 변경감지) (0) | 2025.01.07 |
자바 자료형 변환 정리 (0) | 2022.12.08 |
@AuthenticationPrincipal 사용시 LazyInitializationException (2) | 2022.11.19 |