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 |