Menu
Coddy logo textTech

compareTo()와 Comparable

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 44번째.

Comparable 인터페이스는 객체가 자신의 자연스러운 순서를 정의할 수 있게 해줍니다. 이 인터페이스를 구현함으로써, 여러분의 클래스는 Collections.sort()와 같은 메서드를 사용하여 자동으로 정렬되거나 TreeSet과 같은 정렬된 컬렉션에 저장될 수 있습니다.

인터페이스는 하나의 메서드인 compareTo()를 구현하도록 요구합니다. 이 메서드는 현재 객체를 다른 객체와 비교하여 그들의 상대적인 순서를 나타내는 정수를 반환합니다:

  • 음수: 이 객체가 다른 객체보다 앞에 옵니다
  • 0: 두 객체가 같습니다
  • 양수: 이 객체가 다른 객체보다 뒤에 옵니다
public 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 this.age - other.age;  // 나이 오름차순으로 정렬
    }
}

일단 구현되면 정렬이 간단해집니다:

List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people);  // 이제 나이순으로 정렬됨: Bob, Alice

문자열이나 다른 Comparable 필드를 비교하려면, 뺄셈을 사용하는 대신 해당 객체의 compareTo() 메서드에 위임할 수 있습니다: return this.name.compareTo(other.name);. 이 방식이 더 안전하며 예외적인 상황을 올바르게 처리합니다.

challenge icon

챌린지

쉬움

Comparable 인터페이스를 사용하여 영화를 평점순으로 정렬하는 영화 순위 시스템을 만들어 보겠습니다. 다른 영화와 자신을 비교하는 방법을 알고 있는 Movie 클래스를 생성하여, 평점이 높은 순에서 낮은 순으로 자동 정렬되도록 할 것입니다.

코드는 두 개의 파일로 구성됩니다:

  • Movie.java: 다른 영화와 비교할 수 있는 영화를 나타내는 클래스를 생성합니다. Movie 클래스는 세 개의 private 필드를 가집니다: title (String), director (String), 그리고 rating (double, 0.0에서 10.0 사이). 모든 필드를 초기화하는 생성자와 각 필드에 대한 getter 메서드를 포함하세요.

    Movie 클래스가 Comparable<Movie>를 구현하도록 하고 compareTo() 메서드를 오버라이드하세요. 영화는 평점에 따라 내림차순(평점이 높은 순서)으로 정렬되어야 합니다. double 값을 비교할 때는 안전한 비교를 위해 Double.compare()를 사용하세요. 내림차순 정렬을 위해 순서를 반대로 해야 함을 기억하세요!

    toString()을 오버라이드하여 [title] by [director] - Rating: [rating] 형식을 반환하도록 하세요.

  • Main.java: 영화 리스트를 생성하고 정렬하여 Movie 클래스를 실제로 동작하게 만듭니다. 세 개의 영화에 대한 입력을 받으며, 각 영화는 title,director,rating 형식으로 별도의 줄에 제공됩니다.

    각 줄을 파싱하여 Movie 객체를 생성하고, ArrayList에 추가한 다음, Collections.sort()를 사용하여 리스트를 정렬하세요. Comparable 구현 덕분에 영화들은 평점에 따라 자동으로 정렬될 것입니다!

    정렬 후, toString() 형식을 사용하여 각 영화를 한 줄씩 출력하세요. 평점이 가장 높은 영화가 가장 먼저 나타나야 합니다.

세 줄의 입력을 받게 되며, 각 줄에는 title,director,rating 형식의 영화 데이터가 포함되어 있습니다.

예를 들어, 입력 줄은 다음과 같을 수 있습니다: Inception,Christopher Nolan,8.8

Main 파일에서 java.util.ArrayList, java.util.Collections, java.util.Scanner를 임포트하는 것을 잊지 마세요. Comparable을 구현하면 별도의 comparator 없이도 단 한 번의 메서드 호출로 사용자 정의 객체를 정렬할 수 있다는 점에 주목하세요!

치트 시트

Comparable 인터페이스는 객체가 자동 정렬을 위한 자연스러운 순서를 정의할 수 있게 해줍니다.

다음과 같은 값을 반환하는 compareTo() 메서드를 구현하세요:

  • 음수: 현재 객체가 다른 객체보다 앞에 위치함
  • 0: 두 객체가 동일함
  • 양수: 현재 객체가 다른 객체보다 뒤에 위치함
public class Person implements Comparable<Person> {
    private int age;
    
    @Override
    public int compareTo(Person other) {
        return this.age - other.age;  // Sort by age ascending
    }
}

Collections.sort()를 사용하여 객체를 정렬합니다:

List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people);  // Sorted by age

문자열을 비교할 때는 해당 객체의 compareTo() 메서드에 위임하세요:

return this.name.compareTo(other.name);

double 값을 안전하게 비교하려면 Double.compare()를 사용하세요:

return Double.compare(this.rating, other.rating);  // Ascending
return Double.compare(other.rating, this.rating);  // Descending

직접 해보기

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 영화 데이터 세 줄 읽기
        String line1 = scanner.nextLine();
        String line2 = scanner.nextLine();
        String line3 = scanner.nextLine();
        
        // TODO: Movie 객체를 저장할 ArrayList 생성
        
        // TODO: 각 줄 파싱 (형식: title,director,rating)
        // Hint: 부분을 분리하려면 split(",")을 사용하세요
        // Hint: rating에는 Double.parseDouble()을 사용하세요
        
        // TODO: Movie 객체를 생성하고 리스트에 추가
        
        // TODO: Collections.sort()를 사용하여 리스트 정렬
        
        // TODO: 각 영화 출력 (한 줄에 하나씩)
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨