Comparable 인터페이스
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 72번째.
==가 두 객체가 같은지 알려주는 반면, 때로는 어느 것이 먼저 오는지 알아야 할 필요가 있습니다. Comparable 인터페이스는 자연스러운 순서(natural ordering)를 정의하여 객체가 정렬될 수 있도록 해줍니다.
클래스를 비교 가능하게 만들려면 Comparable<T>를 구현하고 compareTo 메서드를 오버라이드하세요. 이 메서드는 this가 other보다 앞에 오면 음수를, 두 객체가 같으면 0을, this가 other보다 뒤에 오면 양수를 반환합니다:
class Student implements Comparable<Student> {
String name;
int grade;
Student(this.name, this.grade);
@override
int compareTo(Student other) {
return grade.compareTo(other.grade);
}
}
void main() {
var students = [
Student('Alice', 85),
Student('Bob', 92),
Student('Carol', 78),
];
students.sort();
for (var s in students) {
print('${s.name}: ${s.grade}');
}
// Carol: 78, Alice: 85, Bob: 92
}클래스가 Comparable을 구현하면, 사용자 정의 비교자(comparator)를 제공하지 않고도 sort()를 사용할 수 있습니다. 내장된 숫자 및 문자열 타입은 이미 Comparable을 구현하고 있으므로, grade.compareTo(other.grade)가 직접 작동합니다.
내림차순의 경우, 객체를 바꾸거나 결과를 부정하여 비교를 간단히 반전시키면 됩니다:
@override
int compareTo(Student other) {
return other.grade.compareTo(grade); // 내림차순
}챌린지
쉬움우선순위에 따라 작업을 정렬할 수 있는 작업 관리 시스템을 만들어 봅시다! Comparable 인터페이스를 구현하는 Task 클래스를 생성하여, 작업 목록이 가장 높은 우선순위부터 가장 낮은 우선순위 순으로 자동으로 정렬되도록 할 것입니다.
코드는 두 개의 파일로 구성됩니다:
task.dart:name(String)과priority(int, 숫자가 높을수록 높은 우선순위)를 가진 할 일 항목을 나타내는Task클래스를 만듭니다. 정렬 시 작업이 우선순위에 따라 내림차순(높은 우선순위가 먼저)으로 나타나도록Comparable<Task>를 구현해야 합니다. 또한toString()을 오버라이드하여[name] (Priority: [priority])형식으로 반환하도록 하세요.main.dart: 작업 파일을 임포트하고Comparable인터페이스가 어떻게 자동 정렬을 가능하게 하는지 보여줍니다. 다음 네 가지 작업을 포함하는 리스트를 생성하세요:- 우선순위가
2인'Write report' - 우선순위가
5인'Fix critical bug' - 우선순위가
1인'Update documentation' - 우선순위가
3인'Review code'
Before sorting:를 출력한 다음, 각 작업을 출력하세요.sort()를 사용하여 리스트를 정렬하고, 빈 줄을 하나 출력한 뒤,After sorting:를 출력하고 다시 각 작업을 출력하세요.- 우선순위가
Task 클래스가 Comparable을 구현하기 때문에, 별도의 커스텀 비교자(comparator)를 제공하지 않고도 리스트에서 직접 sort()를 호출할 수 있습니다. 작업들은 여러분이 구현한 compareTo를 바탕으로 자동으로 정렬될 것입니다!
예상 출력 결과:
Before sorting:
Write report (Priority: 2)
Fix critical bug (Priority: 5)
Update documentation (Priority: 1)
Review code (Priority: 3)
After sorting:
Fix critical bug (Priority: 5)
Review code (Priority: 3)
Write report (Priority: 2)
Update documentation (Priority: 1)치트 시트
Comparable 인터페이스를 사용하면 객체가 정렬을 위한 자연스러운 순서를 정의할 수 있습니다. Comparable<T>를 구현하고 compareTo 메서드를 오버라이드하세요.
compareTo 메서드는 다음을 반환합니다:
this가other보다 앞에 오면 음수- 두 값이 같으면 0
this가other보다 뒤에 오면 양수
기본 구현 (오름차순):
class Student implements Comparable<Student> {
String name;
int grade;
Student(this.name, this.grade);
@override
int compareTo(Student other) {
return grade.compareTo(other.grade);
}
}클래스가 Comparable을 구현하면, 사용자 정의 비교기 없이 sort()를 사용할 수 있습니다:
var students = [
Student('Alice', 85),
Student('Bob', 92),
Student('Carol', 78),
];
students.sort(); // 자동으로 compareTo를 사용함내림차순의 경우, 비교 순서를 반대로 바꿉니다:
@override
int compareTo(Student other) {
return other.grade.compareTo(grade); // 내림차순
}직접 해보기
import 'task.dart';
void main() {
// TODO: 다음을 포함하는 Task 객체 리스트를 생성하세요:
// - 우선순위가 2인 'Write report'
// - 우선순위가 5인 'Fix critical bug'
// - 우선순위가 1인 'Update documentation'
// - 우선순위가 3인 'Review code'
List<Task> tasks = [
// TODO: 여기에 네 개의 태스크를 추가하세요
];
// TODO: "Before sorting:"을 출력하세요
// TODO: 리스트의 각 태스크를 출력하세요
// TODO: sort()를 사용하여 리스트를 정렬하세요
// TODO: 빈 줄을 출력하세요
// TODO: "After sorting:"을 출력하세요
// TODO: 정렬된 리스트의 각 태스크를 출력하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.