Java에서의 객체 비교 방법: Comparable, Comparator, Lambda
개요
Java에서 객체를 정렬하거나 비교할 때 사용하는 세 가지 주요 방법에 대해 알아보겠습니다.
비교 대상이 불분명할 때의 해결책
Comparable 인터페이스
class Fruit implements Comparable<Fruit> {
private String name;
private int price;
public Fruit(String name, int price) {
this.name = name;
this.price = price;
}
@Override
// 내림차순 구현 예시
public int compareTo(Fruit fruit) {
if (fruit.price < price) {
return -1;
} else if (fruit.price > price) {
return 1;
}
return 0;
}
}
Comparator 인터페이스
// 오름차순 구현 예시
class FruitNameComparator implements Comparator<Fruit> {
@Override
public int compare(Fruit f1, Fruit f2) {
return f1.name.compareTo(f2.name);
}
}
익명 클래스를 사용한 Comparator
PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
// 비교 로직
return 0; // 실제 구현시 적절한 비교 결과 반환
}
});
문자 위치에 따른 정렬 예시
Arrays.sort(strings, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.charAt(n) == o2.charAt(n)) {
return o1.compareTo(o2);
}
return o1.charAt(n) - o2.charAt(n);
}
});
대소문자 구분 없는 문자열 정렬
// 대소문자 구분없이 오름차순
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
// 결과: [a, A, B, C]
// 대소문자 구분없이 내림차순
Collections.sort(list, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
// 결과: [C, B, a, A]
정렬 메소드 예시
// 기본 배열 정렬
Arrays.sort(arr);
// 역순 정렬
Arrays.sort(arr, Collections.reverseOrder());
// 커스텀 정렬
Student[] arr = new Student[3];
Arrays.sort(arr, 커스텀비교자);
각 방법의 사용 시기
Comparable 사용 시기
- 클래스에 명확한 자연 순서가 있을 때 사용
- 비교가 필요한 클래스가 항상 같은 전략으로 정렬될 때 클래스 내부에 구현
- 방향 구분:
- 오름차순:
this.값 - o.값
또는this.compareTo(o)
- 내림차순:
o.값 - this.값
또는o.compareTo(this)
- 오름차순:
- String과 같은 Java 기본 클래스는 이미 Comparable이 구현되어 있어
this.compareTo(o)
로 간단히 사용 가능 (사전순 정렬)
Comparator 사용 시기
- 여러 비교 전략이 필요할 때 사용
- TreeSet, PriorityQueue 등 비교가 필요한 자료구조에서 비교 기준이 없을 때 런타임 에러 발생
- 자료구조 생성 시 Comparator 객체를 파라미터로 전달해야 함
- 상황에 따라 커스텀 비교 로직 적용 가능
Lambda 사용 시기
- 간단한 일회성 비교나 Stream API 사용 시 효과적
- 코드를 간결하게 작성 가능
주의사항
- User 객체와 같이 비교 대상에 따라 연산 방식이 달라질 수 있음:
- int와 같은 기본 타입은
-
연산 가능 - 객체(예: Company)는 직접 비교 불가능하므로 equals 또는 compareTo 메소드 사용
- int와 같은 기본 타입은
'Algorithm' 카테고리의 다른 글
간호사 근무표 생성을 위한 알고리즘. (1) | 2025.02.17 |
---|---|
java 이슈 모아보기 (0) | 2025.01.14 |