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);. 이 방식이 더 안전하며 예외적인 상황을 올바르게 처리합니다.
챌린지
쉬움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: 각 영화 출력 (한 줄에 하나씩)
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조7특별한 메서드와 Object 클래스
toString() 메서드equals()와 hashCode()clone() 메서드compareTo()와 ComparableComparator 인터페이스요약 - 커스텀 정렬