Java

Comparable VS Comparator

KJihun 2025. 3. 2. 17:29
728x90

 

Comparable과 Comparator는 객체 정렬 시 사용되는 인터페이스다.

JIT 컴파일러 최적화 덕분에 성능 차이는 거의 나지 않으며, 사용 목적방식에 따라 적절하게 사용하여야 한다

 

[Java] JIT 컴파일러란?

JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 컴파일러 vs 인터프리터 컴파일러와 인터프리터 모두 high

hyeinisfree.tistory.com

 

 

 Comparable<T>

  • 객체 클래스에서 Comparable<T> 를 implements 한 후, compareTo(T o) 를 구현
  • 객체 자신과 다른 객체를 비교하는 방식
  • Collections.sort() 또는 Arrays.sort() 사용 시 기본 정렬 기준 적용
  • 장점: 기본 정렬 기준을 지정 가능
  • 단점: 클래스 내부에 로직이 포함되어 여러 기준으로 정렬하기 어려움

 

✏️ 예제

// Comparable 을 Student Type으로 implements 받음
// 내부 클래스에서 메서드( compareTo() ) 를 재정의 하여 사용
class Student implements Comparable<Student>{
	 String name;
	 int id;
	 double score;
	 
     ....
	// id로 정렬, 원하는 속성값으로 수정하여 사용가능
	@Override
	public int compareTo(Student s) {
		return this.id - s.id;
	}
	
}

public class Main {
	public static void main(String[] args) {
		
        ...
		
		// Comparator 를 사용한 id 값으로 정렬
		// Student Class 에 Comparable 을 implements 한 후 compareTo 를 재정의 하여 사용
		studentList.sort(Comparator.naturalOrder());	// 오름차순
		studentList.sort(Comparator.reverseOrder()); 	// 내림차순
		studentList.forEach(System.out::println);
	}
}

 

 


 

 Comparator<T>

 

  • Comparator는  compare(T o1, T o2) 메서드를 클래스 외부에서 생성 및 정의하는 방식
  • 두 개의 객체를 비교( o1, o2 ) 하는 방식
  • 장점: 여러 개의 정렬 기준을 만들 수 있음
  • 단점: 기본 정렬 기준이 없으면 매번 Comparator를 지정해야 함

 

✏️ 예제

class Student {
    String name;
    int id;
    double score;
    
    ...
	
    }
}

// Comparable 과 다르게 외부 클래스에서 생성 및 메서드 작성
class IdComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        return Integer.compare(s1.id, s2.id);
    }
}

public class Main {
    public static void main(String[] args) {
    
    	...

        // 학번(id) 기준 정렬
        Collections.sort(students, new IdComparator());

        // 출력
        for (Student s : students) {
            System.out.println(s);
        }
    }
}

 


✅ 차이점 비교


비교 항목 Comparable Comparator
정렬 기준 위치 클래스 내부에서 직접 구현 별도의 클래스 또는 람다식으로 구현
메서드 compareTo(T o) compare(T o1, T o2)
기본 정렬 기준 1개 (클래스에 하나만 정의 가능) 여러 개의 정렬 기준을 만들 수 있음
Collections.sort() 사용 Collections.sort(list) Collections.sort(list, comparator)
클래스 변경 여부 필요 (클래스 내부에서 구현) 불필요 (외부에서 정의 가능)

 

✅ 언제 사용해야 할까?

  • 기본 정렬 기준이 필요한 경우  Comparable
  • 여러 기준으로 정렬해야 하는 경우  Comparator
  • 클래스를 수정할 수 없는 경우 (예: 외부 라이브러리 객체 정렬)  Comparator

✅ 언제 사용해야 할까?

  • 일반적인 경우 성능 차이는 없다. (O(N log N))
  • 정렬 기준이 고정적이라면 Comparable을 사용하면 좋음.
  • 정렬 기준이 자주 변경된다면 Comparator가 더 유연하고 효율적.
  • 람다식을 활용하면 Comparator의 오버헤드를 줄일 수 있음.
  • JIT 최적화 덕분에 성능 차이는 미미함.

즉, 성능보다는 유지보수성과 코드의 유연성을 고려하여 선택하는 것이 중요! 🚀

 


 

✅ 결론

  • Comparable은 클래스 내부에서 기본 정렬 기준을 정의
  • Comparator는 클래스 외부에서 다양한 정렬 기준을 제공
  • Java 8 이상에서는 Comparator를 람다식으로 활용하면 더 유연하게 정렬 가능

 

어떤 기준으로 정렬할지 정해져 있다면 Comparable,
정렬 기준이 여러 개 필요하거나 클래스 변경이 어렵다면 Comparator를 사용하는 것이 좋다



'Java' 카테고리의 다른 글

HttpSession(서버 세션)  (0) 2025.04.03
Servlet, JSP  (0) 2025.04.02
[Java] Stream  (0) 2023.06.21
오버로딩(Overloading)과 오버라이딩(Overriding)  (0) 2023.06.09
모던 자바 알아보기(람다, 스트림, Optional)  (0) 2023.05.30