Menu
Coddy logo textTech

Comparable 인터페이스

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

==가 두 객체가 같은지 알려주는 반면, 때로는 어느 것이 먼저 오는지 알아야 할 필요가 있습니다. Comparable 인터페이스는 자연스러운 순서(natural ordering)를 정의하여 객체가 정렬될 수 있도록 해줍니다.

클래스를 비교 가능하게 만들려면 Comparable<T>를 구현하고 compareTo 메서드를 오버라이드하세요. 이 메서드는 thisother보다 앞에 오면 음수를, 두 객체가 같으면 0을, thisother보다 뒤에 오면 양수를 반환합니다:

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);  // 내림차순
}
challenge icon

챌린지

쉬움

우선순위에 따라 작업을 정렬할 수 있는 작업 관리 시스템을 만들어 봅시다! 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 메서드는 다음을 반환합니다:

  • thisother보다 앞에 오면 음수
  • 두 값이 같으면 0
  • thisother보다 뒤에 오면 양수

기본 구현 (오름차순):

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: 정렬된 리스트의 각 태스크를 출력하세요
}
quiz icon실력 점검

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

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