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()를 적극적으로 활용해볼 계획이다.
'알고리즘' 카테고리의 다른 글
[알고리즘] 완전 탐색과 시뮬레이션 - 시키는 대로 구현하기의 시작 (2) | 2025.07.30 |
---|---|
[알고리즘] 삽입 정렬 (Insertion Sort) 완전 정리 (4) | 2025.07.27 |