본문 바로가기
Language/Java

[JAVA] Comparable vs Comparator : 객체 정렬의 두 가지 핵심 전략 완벽 가이드

by Papa Martino V 2026. 1. 18.
728x90

Comparable vs Comparator
Comparable vs Comparator

 

자바(Java)를 활용해 복잡한 데이터를 다루다 보면, 리스트나 배열에 담긴 객체들을 특정 기준에 따라 정렬해야 하는 상황을 마주하게 됩니다. 단순히 숫자나 문자열을 정렬하는 것을 넘어, 우리가 직접 정의한 '사용자 정의 객체'를 정렬할 때 자바는 두 가지 강력한 인터페이스를 제공합니다. 바로 ComparableComparator입니다. 이 두 인터페이스는 모두 객체의 정렬 기준을 정의하기 위해 존재하지만, 그 '목적''사용 시점'에는 명확한 차이가 있습니다. 오늘은 실무 개발에서 이 둘을 어떻게 구분하여 사용하는지, 그리고 왜 이러한 설계가 필요한지 심층적으로 분석해 보겠습니다.

1. Comparable: "나는 나를 정렬할 수 있다" (자연스러운 순서)

Comparable 인터페이스는 객체의 기본 정렬 기준을 설정할 때 사용합니다. 클래스 내부에 직접 구현하기 때문에 "이 클래스의 객체들은 기본적으로 이 순서에 따라 나열된다"는 의미를 가집니다. 이를 흔히 Natural Ordering(자연스러운 순서)이라고 부릅니다.

주요 특징

  • java.lang 패키지에 포함되어 있습니다.
  • compareTo(T o) 메서드 하나만 구현하면 됩니다.
  • 자바의 String, Integer 같은 기본 래퍼 클래스들은 이미 이 인터페이스를 구현하고 있습니다.
  • 클래스 설계 시점에 정렬 기준이 고정적일 때 매우 유리합니다.

2. Comparator: "내가 너희들을 정렬해 줄게" (특수한 순서)

반면, Comparator 인터페이스는 정렬 대상 클래스와는 별개로 정렬 기준을 정의하고 싶을 때 사용합니다. 이미 Comparable이 구현된 클래스에 대해 다른 방식의 정렬이 필요하거나(예: 오름차순 대신 내림차순), 내가 수정할 수 없는 외부 라이브러리 클래스를 정렬해야 할 때 구원투수 역할을 합니다.

주요 특징

  • java.util 패키지에 포함되어 있습니다.
  • compare(T o1, T o2) 메서드를 구현합니다.
  • 익명 클래스나 람다식(Lambda Expression)을 사용하여 즉석에서 정렬 기준을 생성하기에 매우 적합합니다.
  • 동일한 객체군에 대해 여러 가지 정렬 기준(이름순, 나이순, 등록일순 등)을 가질 수 있게 합니다.

3. 결정적인 차이점 요약

두 인터페이스의 기술적인 차이점과 실무적인 활용도를 한눈에 비교할 수 있도록 정리했습니다.

항목 Comparable Comparator
패키지 java.lang java.util
구현 메서드 compareTo(T o) compare(T o1, T o2)
비교 대상 자기 자신과 매개변수 객체 비교 두 개의 매개변수 객체 비교
핵심 개념 기본 정렬 기준 (Natural Order) 특수 정렬 기준 (Custom Order)
수정 여부 해당 클래스의 소스코드를 수정해야 함 클래스 수정 없이 외부에서 정의 가능

4. 정렬 로직의 반환값 이해

두 메서드 모두 정수값을 반환하여 정렬 방향을 결정합니다. 이 메커니즘을 정확히 아는 것이 논리 오류를 막는 핵심입니다.

  • 양수 반환: 첫 번째 객체가 크다고 판단 (두 객체의 위치를 바꿈)
  • 0 반환: 두 객체의 크기가 같음
  • 음수 반환: 첫 번째 객체가 작다고 판단 (위치를 유지함)

5. 실무적인 팁: 람다와 정렬

자바 8 이후부터 Comparator는 더욱 강력해졌습니다. Comparator.comparing()이나 thenComparing()과 같은 정적 메서드를 활용하면 가독성 높은 코드를 작성할 수 있습니다. 예를 들어 "나이순으로 정렬하되 나이가 같으면 이름순으로 정렬"하는 복합 로직도 단 몇 줄의 코드로 구현이 가능합니다.


참고 출처 및 권장 도서

  1. Oracle Java SE Documentation: Comparable Interface
  2. Oracle Java SE Documentation: Comparator Interface
  3. Joshua Bloch, Effective Java 3rd Edition - Item 14: Comparable 구현 고려
  4. Herbert Schildt, Java: The Complete Reference
728x90