자료구조

Comparable VS Comparator 의 이해

Z00_HWAN_99 2024. 6. 30. 20:58
728x90
반응형

요새 정렬에 관련된 문제를 접해보고 있고, 제가 아직은 많이 써보지 못한 인터페이스에 대해 오늘은 알려드릴려고 합니다. 그것은 바로 Comparable과 Comparator입니다.

 

Comparable과 Comparator는 둘 다 Java에서 객체를 정렬하는 데 사용되는 인터페이스입니다. 이 두 인터페이스는 비슷한 목적을 가지고 있지만, 사용 방법과 용도가 다릅니다. 각각의 인터페이스에 대해 자세히 설명하고, 사용 방법 및 차이점을 비교해 보겠습니다.

 

Comparable 인터페이스

Comparable 인터페이스는 객체 자신이 다른 객체와 비교할 수 있도록 함. 주로 객체의 기본 정렬 기준을 정의할 때 사용.

 

사용 방법

  1. Comparable 인터페이스를 구현할 클래스에 implements Comparable<T>를 추가.
  2. compareTo 메서드를 오버라이드하여 객체 간 비교 로직을 정의.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Student implements Comparable<Student> {
  private String name;
  private int score;

  public Student(String name, int score) {
    this.name = name;
    this.score = score;
  }
  @Override
  public int compareTo(Student other) {
    // 점수를 기준으로 오름차순 정렬
    return Integer.compare(this.score, other.score);
  }
  @Override
  public String toString() {
    return name + ": " + score;
  }
  public static void main(String[] args) {
    List<Student> students = new ArrayList<>();
    students.add(new Student("홍길동", 88));
    students.add(new Student("김철수", 75));
    students.add(new Student("이영희", 95));

    Collections.sort(students);
    for (Student student : students) {
      System.out.println(student);
    }
  }
}
  • 위 예제에서는 Student 클래스가 Comparable<Student>를 구현하고 compareTo 메서드에서 점수를 기준으로 오름차순 정렬하도록 정의. Collections.sort를 사용하면 자동으로 compareTo 메서드가 호출되어 정렬됨.

Comparator 인터페이스

Comparator 인터페이스는 두 객체를 비교할 수 있도록 함. 주로 클래스 외부에서 여러 가지 기준으로 정렬해야 할 때 사용함.

 

사용 방법

  1. Comparator 인터페이스를 구현한 클래스를 정의하거나 익명 클래스 또는 람다식을 사용하여 compare 메서드를 오버라이드함.
  2. compare 메서드에서 두 객체 간의 비교 로직을 정의함.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class Student {
  private String name;
  private int score;
  public Student(String name, int score) {
    this.name = name;
    this.score = score;
  }
  @Override
  public String toString() {
    return name + ": " + score;
  }
  public static void main(String[] args) {
    List<Student> students = new ArrayList<>();
    students.add(new Student("홍길동", 88));
    students.add(new Student("김철수", 75));
    students.add(new Student("이영희", 95));

    // 점수를 기준으로 오름차순 정렬하는 Comparator
    Comparator<Student> scoreComparator = new Comparator<Student>() {
      @Override
      public int compare(Student s1, Student s2) {
        return Integer.compare(s1.score, s2.score);
      }
    };

    Collections.sort(students, scoreComparator);
    for (Student student : students) {
      System.out.println(student);
    }

    // 이름을 기준으로 오름차순 정렬하는 Comparator
    Comparator<Student> nameComparator = new Comparator<Student>() {
      @Override
      public int compare(Student s1, Student s2) {
        return s1.name.compareTo(s2.name);
      }
    };

    Collections.sort(students, nameComparator);
    for (Student student : students) {
      System.out.println(student);
    }
  }
}
  • 위 예제에서는 Student 클래스가 Comparable 인터페이스를 구현하지 않았음. 대신 Comparator 인터페이스를 사용하여 외부에서 정렬 기준을 정의함. Collections.sort를 사용할 때 Comparator를 전달하여 원하는 기준으로 정렬.

차이점 정리

특성ComparableComparator

특성 Comparable Comparator
패키지 java.lang java.util
비교 메서드 compareTo(T o) compare(T o1, T o2)
정의 위치 비교할 클래스 내부 비교할 클래스 외부
변경 가능성 클래스 정의를 수정해야 함 클래스 정의를 수정할 필요 없음
사용 용도 기본 비교 방식이 하나일 때 여러 가지 기준으로 비교해야 할 때
사용 방법 Collections.sort(List<T>) Collections.sort(List<T>, Comparator<T>)
자바 8 이상 N/A 람다식을 사용하여 간결하게 정의 가능

 

  • "Comparable"은 클래스 내부에서 기본 정렬 방식을 정의하는 데 사용되며, compareTo 메서드를 통해 자연 정렬 순서를 구현합니다.
  • "Comparator"는 클래스 외부에서 다양한 정렬 방식을 정의하는 데 사용되며, compare 메서드를 통해 여러 정렬 기준을 적용할 수 있습니다.
  • 자바 8에서는 Comparator를 람다식을 통해 더 간결하게 정의할 수 있으며, 다양한 기본 메서드를 제공하여 정렬 작업을 쉽게 수행할 수 있습니다.

결론

Comparable은 클래스 자체에서 비교 로직을 정의하는 반면, Comparator는 외부에서 비교 로직을 정의할 수 있어 유연성이 더 높습니다. 여러 기준으로 객체를 정렬해야 하는 경우 Comparator를 사용하는 것이 더 적합합니다.

 

https://github.com/bottomsUp-99?tab=repositories

 

bottomsUp-99 - Overview

Backend Developer. bottomsUp-99 has 10 repositories available. Follow their code on GitHub.

github.com

 

728x90
반응형

'자료구조' 카테고리의 다른 글

자바 컬렉션 프레임워크  (0) 2024.07.10
자바 스트림(Stream)이란?  (0) 2024.07.03
ConcurrentHashMap VS ConcurrentSkipListMap 이란?  (0) 2024.06.19
AuthProvider VS Provider 이란?  (0) 2024.06.19
Map이란?  (0) 2024.06.19