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 Integer.compare(this.age, other.age);  // age 오름차순으로 정렬
    }
}

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

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

문자열이나 다른 Comparable fields를 비교할 때는 뺄셈을 사용하는 대신 해당 객체의 compareTo() 메서드에 위임할 수 있습니다: return this.name.compareTo(other.name);. 이 방식은 더 안전하며 예외적인 경우도 적절하게 처리합니다. int fields의 경우에는 a - b보다 Integer.compare(a, b)를 사용하는 것이 좋습니다. 뺄셈은 극단적인 값에서 오버플로를 일으킬 수 있기 때문입니다.

challenge icon

챌린지

쉬움

Comparable 인터페이스를 사용하여 영화 평점을 기준으로 영화를 정렬하는 영화 순위 시스템을 만들어 봅시다. 다른 영화와 자신을 비교하는 방법을 알고 있는 Movie class를 만들면, 가장 높은 평점부터 가장 낮은 평점까지 자동으로 정렬할 수 있습니다.

코드를 두 파일로 구성합니다:

  • Movie.java: 다른 영화와 비교할 수 있는 영화를 나타내는 class를 Create합니다. Movie에는 세 개의 private fields가 있습니다: title (String), director (String), rating (double, 0.0부터 10.0까지). 모든 fields를 초기화하는 constructor와 각각의 getter 메서드를 포함하세요.

    Movie class가 Comparable<Movie>를 implement하도록 하고 compareTo() 메서드를 override하세요. 영화는 rating을 기준으로 descending order (highest rated first)로 정렬되어야 합니다. double을 비교할 때는 안전한 비교를 위해 Double.compare()를 사용하세요. descending 정렬을 위해 순서를 반대로 해야 한다는 점을 기억하세요!

    toString()을 override하여 다음을 반환하도록 하세요: [title] by [director] - Rating: [rating]

  • Main.java: 영화 목록을 Create하고 정렬하여 Movie class를 실제로 사용해 봅니다. 세 영화에 대한 입력을 받으며, 각 영화는 다음 형식의 별도 line에 입력됩니다: title,director,rating

    각 line을 Parse하여 Movie 객체를 Create하고, 이를 ArrayList에 add한 다음 Collections.sort()를 사용하여 list를 정렬하세요. Comparable 구현 덕분에 영화가 rating을 기준으로 자동으로 정렬됩니다!

    정렬한 후 toString() 형식을 사용하여 각 영화를 한 줄에 하나씩 출력하세요. highest-rated 영화가 first에 표시되어야 합니다.

다음 형식으로 영화 data가 포함된 세 개의 line을 입력받습니다: title,director,rating

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

Main file에서 java.util.ArrayList, java.util.Collections, java.util.Scanner를 import해야 합니다. Comparable을 implement하면 단일 메서드 호출만으로 custom 객체를 정렬할 수 있다는 점에 주목하세요. 추가 comparator가 필요하지 않습니다!

직접 해보기

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: 평점에 Double.parseDouble()을 사용
        
        // TODO: Movie 객체를 생성하고 리스트에 추가
        
        // TODO: Collections.sort()를 사용하여 리스트 정렬
        
        // TODO: 각 영화를 출력 (한 줄에 하나씩)
    }
}
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 Java 컴파일러