JAVA

[JAVA] 자바에서 Comparable과 Comparator 객체 비교의 이해와 활용

ioh'sDeveloper 2024. 6. 11. 23:43

Comparable과 Comparator: 객체의 비교

비교적으로 가장 어려운 개념 중 하나는 객체를 비교하는 것입니다. 자바에서는 이를 처리하기 위해 Comparable과 Comparator를 제공합니다.

 

1. Comparable: 객체 스스로 비교하는 능력

Comparable은 객체가 스스로를 비교하는 능력을 갖추게 합니다. 이는 마치 각 객체가 "내가 더 큰가?", "내가 더 작은가?"를 직접 판단하는 것과 같습니다. 예를 들어, 숫자들의 배열이 있다면, Comparable을 구현한 숫자 클래스는 숫자 자체로 크기를 비교할 수 있습니다.

 

2. Comparator: 외부에서 비교하는 방법을 제공

반면에 Comparator는 외부에서 비교 방법을 제공합니다. 즉, 객체가 스스로 비교하지 않고 외부에서 주어진 비교 방법을 따라가게 됩니다. 이는 마치 외부에서 "너희 둘을 비교해봐"라고 지시하는 것과 같습니다. 예를 들어, 이름이나 다른 속성에 따라 객체를 비교하고 싶을 때 Comparator를 사용할 수 있습니다.

 

Comparator의 익명 객체: 필요한 곳에서 바로 비교 방법 제공하기

Comparator를 사용할 때, 종종 익명 객체를 생성하여 비교 방법을 제공합니다. 이는 코드를 간결하게 만들어주고, 필요한 곳에서 바로 비교 방법을 정의할 수 있게 합니다. 예를 들어, 정렬이나 우선순위 큐에서 사용될 때 특히 편리합니다.

 

정렬과의 관계: Comparable과 Comparator를 통해 객체 정렬하기

정렬이라는 작업은 객체들을 어떤 순서로 배열하거나 정렬하는 것을 의미합니다. 이때 Comparable과 Comparator를 사용하여 객체들을 정렬할 수 있습니다. Comparable은 객체의 자연스러운 순서를 정의할 때 사용되며, Comparator는 외부에서 원하는 순서를 제공할 때 사용됩니다.

 


Comparable과 Comparator는 자바에서 객체의 비교를 위한 인터페이스입니다. 둘 다 객체를 비교하는 데 사용되지만, 사용하는 방식과 목적이 약간 다릅니다

 

Comparable:

  • Comparable 인터페이스는 자바 클래스에 구현할 수 있는 인터페이스로, 객체가 자신과 다른 객체를 비교하는 데 사용됩니다.
  • 객체가 Comparable을 구현하면, 이 객체들의 리스트를 정렬할 때 자연스러운 순서(natural order)로 정렬할 수 있습니다. 예를 들어, String, Integer, Double 등은 이미 Comparable을 구현하고 있습니다.
  • Comparable을 구현한 클래스는 compareTo() 메서드를 오버라이드해야 합니다. 이 메서드는 다른 객체와 비교하여 현재 객체가 더 작으면 음수를, 같으면 0을, 더 크면 양수를 반환합니다.
import java.util.Arrays;

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

    // Constructor, getters, setters

    @Override
    public int compareTo(Person other) {
        return this.age - other.age; // Compare by age
    }
}

public class Main {
    public static void main(String[] args) {
        Person[] people = {new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 35)};
        Arrays.sort(people); // Sort by age using Comparable
        for (Person person : people) {
            System.out.println(person.getName() + " " + person.getAge());
        }
    }
}

 

 

Comparator:

  • Comparator 인터페이스는 객체의 비교 방법을 정의할 때 사용됩니다. 즉, 이미 구현된 클래스에 대한 비교 방법을 변경하고자 할 때 사용합니다.
  • Comparator를 사용하면 이미 정의된 클래스의 정렬 순서를 변경하거나 다양한 기준에 따라 정렬할 수 있습니다.
  • Comparator를 구현한 클래스는 compare() 메서드를 오버라이드해야 합니다. 이 메서드는 두 객체를 비교하여 첫 번째 객체가 작으면 음수를, 같으면 0을, 더 크면 양수를 반환합니다.
import java.util.Arrays;
import java.util.Comparator;

class Person {
    private String name;
    private int age;

    // Constructor, getters, setters
}

public class Main {
    public static void main(String[] args) {
        Person[] people = {new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 35)};
        
        // Sort by name using Comparator
        Arrays.sort(people, new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return p1.getName().compareTo(p2.getName());
            }
        });
        for (Person person : people) {
            System.out.println(person.getName() + " " + person.getAge());
        }
    }
}

 

요약하면, Comparable은 객체가 자신의 비교 방법을 지정하는 데 사용되고, Comparator는 외부에서 객체의 비교 방법을 제공하는 데 사용됩니다.