Menu
Coddy logo textTech

메서드가 포함된 Enum

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

Dart에서 enums는 단순한 상수 목록이 아닙니다. 필드, 생성자, 메서드를 가질 수 있어 강력한 미니 클래스 역할을 합니다. 이를 향상된 열거형(enhanced enums)이라고 하며, 각 enum 값에 동작과 데이터를 직접 연결할 수 있게 해줍니다.

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  
  const Status(this.displayName);
  
  bool get isFinalized => this == approved || this == rejected;
}

void main() {
  var status = Status.pending;
  print(status.displayName);    // Waiting
  print(status.isFinalized);    // false
  
  print(Status.approved.isFinalized);  // true
}

각 enum 값은 고유한 인수를 사용하여 생성자를 호출합니다. 생성자는 const여야 하며 모든 필드는 final이어야 합니다. enum의 데이터로 작업하거나 다른 값과 비교하는 getter 및 메서드를 추가할 수 있습니다.

향상된 열거형은 인터페이스를 구현할 수도 있어, 훨씬 더 많은 유연성을 제공합니다:

enum Priority implements Comparable<Priority> {
  low(1),
  medium(2),
  high(3);

  final int level;
  const Priority(this.level);

  @override
  int compareTo(Priority other) => level.compareTo(other.level);
}

void main() {
  var tasks = [Priority.high, Priority.low, Priority.medium];
  tasks.sort();
  print(tasks);  // [Priority.low, Priority.medium, Priority.high]
}

향상된 열거형(Enhanced enums)은 메시지가 포함된 상태 코드, 레벨이 포함된 우선순위, 또는 좌표가 포함된 방향과 같이, 각각 관련된 데이터나 동작이 필요한 고정된 값의 집합이 있을 때 사용하기에 이상적입니다.

challenge icon

챌린지

쉬움

향상된 열거형(enhanced enums)을 사용하여 작업 관리 시스템을 구축해 봅시다! 작업을 정리하고 우선순위를 정하는 데 도움이 되는 고유한 속성과 동작을 가진 다양한 작업 카테고리를 나타내는 열거형을 만들 것입니다.

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

  • task_category.dart: 프로젝트의 다양한 작업 유형을 나타내는 TaskCategory라는 향상된 열거형을 만듭니다. 각 카테고리는 다음을 포함해야 합니다:
    • 사람이 읽을 수 있는 이름을 위한 String label 필드
    • int priority 필드 (1이 가장 높은 우선순위, 3이 가장 낮은 우선순위)
    • 두 필드를 모두 초기화하는 const 생성자
    • 네 개의 열거형 값: bug (label: "Bug Fix", priority: 1), feature (label: "New Feature", priority: 2), documentation (label: "Documentation", priority: 3), testing (label: "Testing", priority: 2)
    • 우선순위가 1인 경우 true를 반환하는 게터 isUrgent
    • [label] (Priority: [priority]) 형식의 문자열을 반환하는 describe() 메서드
    또한 작업이 우선순위에 따라 정렬될 수 있도록(우선순위 숫자가 낮을수록 먼저 옴) 열거형은 Comparable<TaskCategory>를 구현해야 합니다.
  • main.dart: 작업 카테고리 열거형을 가져와서 그 기능을 시연합니다:
    • feature, bug, documentation, testing 순서로 네 가지 작업 카테고리를 모두 포함하는 리스트를 만듭니다.
    • describe() 메서드를 사용하여 각 카테고리의 설명을 한 줄에 하나씩 출력합니다.
    • 빈 줄을 하나 출력합니다.
    • 리스트를 우선순위에 따라 정렬하고 After sorting by priority:를 출력합니다.
    • 정렬된 각 카테고리의 레이블을 한 줄에 하나씩 출력합니다.
    • 빈 줄을 하나 출력합니다.
    • Urgent tasks:를 출력합니다.
    • 원래 순서(feature, bug, documentation, testing)대로 반복문을 돌며 isUrgent가 true인 카테고리의 레이블만 출력합니다.

이 챌린지는 필드, 생성자, 게터, 메서드, 인터페이스 구현 등 향상된 열거형의 기능들을 결합하여 유용한 작업 분류 시스템을 만드는 과정을 다룹니다!

예상 출력 결과:

New Feature (Priority: 2)
Bug Fix (Priority: 1)
Documentation (Priority: 3)
Testing (Priority: 2)

After sorting by priority:
Bug Fix
New Feature
Testing
Documentation

Urgent tasks:
Bug Fix

치트 시트

Dart의 향상된 열거형(Enhanced enums)은 필드, 생성자, 메서드를 가질 수 있어, 각 열거형 값에 동작과 데이터를 연결하는 강력한 미니 클래스 역할을 합니다.

필드와 생성자가 있는 기본적인 향상된 열거형:

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  
  const Status(this.displayName);
}

주요 요구 사항:

  • 생성자는 반드시 const여야 합니다.
  • 모든 필드는 반드시 final이어야 합니다.
  • 각 열거형 값은 특정 인수를 사용하여 생성자를 호출합니다.

향상된 열거형은 게터(getter)와 메서드를 포함할 수 있습니다:

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  const Status(this.displayName);
  
  bool get isFinalized => this == approved || this == rejected;
}

향상된 열거형은 Comparable과 같은 인터페이스를 구현할 수 있습니다:

enum Priority implements Comparable<Priority> {
  low(1),
  medium(2),
  high(3);

  final int level;
  const Priority(this.level);

  @override
  int compareTo(Priority other) => level.compareTo(other.level);
}

각각 연관된 데이터나 동작이 필요한 고정된 값 집합이 있을 때 향상된 열거형을 사용하세요.

직접 해보기

import 'task_category.dart';

void main() {
  // TODO: 다음 순서대로 네 가지 작업 카테고리를 모두 포함하는 리스트를 생성하세요:
  // feature, bug, documentation, testing
  
  // TODO: describe()를 사용하여 각 카테고리의 설명을 한 줄에 하나씩 출력하세요
  
  // TODO: 빈 줄을 출력하세요
  
  // TODO: 우선순위(priority)에 따라 리스트를 정렬하세요
  
  // TODO: "After sorting by priority:"를 출력하세요
  
  // TODO: 정렬된 각 카테고리의 라벨(label)을 한 줄에 하나씩 출력하세요
  
  // TODO: 빈 줄을 출력하세요
  
  // TODO: "Urgent tasks:"를 출력하세요
  
  // TODO: 원래 순서(feature, bug, documentation, testing)대로 루프를 돌면서
  // isUrgent가 true인 카테고리의 라벨만 출력하세요
}
quiz icon실력 점검

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

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