코드 저장소.

객체 비교를 위한 Comparator , Comparable 본문

Java

객체 비교를 위한 Comparator , Comparable

slown 2025. 2. 6. 16:16

목차

1.Comparable 인터페이스

2.Comparator 인터페이스 

 

1.Comparable 인터페이스

Comparable 인터페이스는 객체 자신이 기본 정렬 방식을 정의할 때 사용됩니다. 즉, 특정 객체가 어떻게 비교될 것인지(순서 지정)를 해당 클래스 내에서 직접 정의합니다.

Comparable 인터페이스의 특징

  • compareTo() 메서드를 오버라이드하여 비교 로직을 정의함
  • 같은 타입의 객체끼리 비교 가능
  • 자연 정렬(Natural Ordering)을 제공
  • Collections.sort()에서 사용 가능

Comparable을 사용한 예시

import java.util.*;

class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age); // 나이를 기준으로 오름차순 정렬
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

public class ComparableExample {
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 30));
        people.add(new Person("Bob", 25));
        people.add(new Person("Charlie", 35));
        
        Collections.sort(people); // Comparable 기준 (나이 오름차순)으로 정렬
        System.out.println(people);
    }
}

 

출력 결과

[Bob (25), Alice (30), Charlie (35)]

 

위 예제에서 Person 클래스는 Comparable<Person>을 구현하여 compareTo() 메서드를 오버라이드했습니다. 따라서 Collections.sort()를 호출하면 자동으로 나이를 기준으로 오름차순 정렬됩니다.

2.Comparator 인터페이스 

Comparator 인터페이스는 객체의 정렬 방식을 외부에서 정의할 때 사용됩니다. 즉, 같은 클래스의 객체라도 여러 기준으로 정렬해야 하는 경우에 활용됩니다.

Comparator 인터페이스의 특징

  • compare() 메서드를 오버라이드하여 비교 로직을 정의함
  • 동일한 객체에 대해 여러 개의 정렬 기준을 적용할 수 있음
  • Collections.sort() 또는 List.sort()에서 사용 가능
  • 기존 클래스에 변경 없이 새로운 정렬 기준을 적용할 수 있음

Comparator 의 예시

import java.util.*;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

// 나이 기준 정렬
class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return Integer.compare(p1.getAge(), p2.getAge());
    }
}

// 이름 기준 정렬
class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
}

public class ComparatorExample {
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 30));
        people.add(new Person("Bob", 25));
        people.add(new Person("Charlie", 35));

        // 나이 기준 정렬
        Collections.sort(people, new AgeComparator());
        System.out.println("나이 기준 정렬: " + people);
        
        // 이름 기준 정렬
        Collections.sort(people, new NameComparator());
        System.out.println("이름 기준 정렬: " + people);
    }
}

 

출력 결과

나이 기준 정렬: [Bob (25), Alice (30), Charlie (35)]
이름 기준 정렬: [Alice (30), Bob (25), Charlie (35)]

 

위 코드에서는 AgeComparatorNameComparator를 각각 만들어서 나이 기준 정렬이름 기준 정렬을 다르게 적용했습니다.