알고리즘

[알고리즘] compareTo() 메서드

dev-nadan 2025. 8. 13. 15:55

1. compareTo()란?

Java에서 객체를 서로 비교하여 순서를 결정할 때 사용하는 메서드입니다.

Comparable 인터페이스에 정의되어 있으며,

정렬 시 오름차순/내림차순 기준을 만들 때 자주 활용됩니다.

public interface Comparable<T> {
    int compareTo(T o);
}

 


2. 반환값 규칙

compareTo()는 비교 결과를 정수로 반환합니다.

반환값 의미
음수 ( < 0 ) 현재 객체(this)가 비교 대상(o)보다 작다
0 현재 객체와 비교 대상이 같다
양수 ( > 0 ) 현재 객체(this)가 비교 대상(o)보다 크다

 


3. 사용 예시

3-1. 문자열 비교

 

문자열은 유니코드 값을 기준으로 한 글자씩 비교합니다.

String a = "apple";
String b = "banana";

System.out.println(a.compareTo(b)); // -1 → 'a'가 'b'보다 앞
System.out.println(b.compareTo(a)); //  1 → 'b'가 'a'보다 뒤
System.out.println(a.compareTo("apple")); // 0 → 같음

비교 과정 ("apple".compareTo("banana"))

  • 첫 글자 ‘a’(97) vs ‘b’(98)
  • 97 - 98 = -1 → “apple”이 사전순으로 더 앞

3-2. 숫자 비교

Integer num1 = 10;
Integer num2 = 20;

System.out.println(num1.compareTo(num2)); // -1 (10 < 20)
System.out.println(num2.compareTo(num1)); //  1 (20 > 10)
System.out.println(num1.compareTo(10));   //  0 (같음)

4. 정렬에서 활용하기

4-1. 오름차순 정렬

List<String> words = Arrays.asList("banana", "apple", "cherry");
words.sort((o1, o2) -> o1.compareTo(o2));
// 결과: [apple, banana, cherry]

 

4-2. 내림차순 정렬

words.sort((o1, o2) -> o2.compareTo(o1));
// 결과: [cherry, banana, apple]

5. 백준 1181 예시

백준 1181(단어 정렬) 문제에서는 다음과 같이 활용됩니다.

words.sort((o1, o2) -> {
    if (o1.length() != o2.length()) {
        return o1.length() - o2.length(); // 길이순
    }
    return o1.compareTo(o2); // 길이가 같으면 사전순
});

 

  • 길이가 다르면 길이 기준 정렬
  • 길이가 같으면 사전순 정렬(compareTo)

6. 주의사항

  • 대칭성: a.compareTo(b) > 0이면 b.compareTo(a) < 0 이어야 함
  • 추이성: a > b이고 b > c이면 a > c여야 함
  • equals 일관성: compareTo()가 0이면 equals()도 true가 되는 것이 좋음

7. 마무리

이번에 compareTo()를 정리하면서 단순히 “사전순 비교” 기능이 아니라,

정렬 로직을 유연하게 설계할 수 있는 강력한 도구라는 걸 새삼 느꼈다.

특히 다중 정렬 기준을 만들 때 길이 → 사전순처럼 조건을 조합하는 방식이

실무에서 테이블 정렬, API 응답 정렬, 데이터 가공 등 다양한 상황에 그대로 활용될 수 있음을 깨달았다.

 

그동안은 sort() 안에 조건식을 바로 쓰는 정도로만 생각했는데,

이번 학습을 통해 반환값의 의미(음수/0/양수)와 대칭성,추이성 같은 원칙을 이해하게 되어

더 안정적이고 의도한 대로 동작하는 정렬 로직을 설계할 자신이 생겼다.

앞으로는 알고리즘 문제뿐 아니라 서비스 로직에서도

정렬 조건이 복잡해질 때 compareTo()를 적극적으로 활용해볼 계획이다.