본문 바로가기

Algorithm

Comparable vs Comparator

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 메소드 사용

'Algorithm' 카테고리의 다른 글

간호사 근무표 생성을 위한 알고리즘.  (1) 2025.02.17
java 이슈 모아보기  (0) 2025.01.14