enum

topics 500-모바일개발 503 Dart
types 이론 레퍼런스
tags #dart #enum
references ctoahn.tistory.com/27 dart.dev/language/enums

Enum

Dart의 Enum 사용법이다.

기본 Enum

enum Status {
  pending,
  approved,
  rejected,
}

// 사용
final status = Status.pending;
print(status.name);   // 'pending'
print(status.index);  // 0

Enhanced Enum (Dart 2.17+)

Dart 3.0 이후로 Enhanced Enum이 추가되어서 더 강력해졌다. 필드와 메서드를 가질 수 있어서 단순 상수 집합 이상의 역할을 할 수 있다.

enum Status {
  pending('대기', Colors.grey),
  approved('승인', Colors.green),
  rejected('거절', Colors.red);

  final String label;
  final Color color;

  const Status(this.label, this.color);

  // 메서드도 가능
  bool get isFinalized => this == approved || this == rejected;
}

// 사용
final status = Status.pending;
print(status.label);  // '대기'
print(status.color);  // Colors.grey

Enum에서 switch 사용

String getMessage(Status status) {
  return switch (status) {
    Status.pending => '처리 중입니다',
    Status.approved => '승인되었습니다',
    Status.rejected => '거절되었습니다',
  };
}

장점: switch가 모든 case를 처리하는지 컴파일러가 확인해준다. case를 빠뜨리면 경고가 뜬다.

Enum과 JSON 변환

enum Status {
  pending,
  approved,
  rejected;

  // String → Enum
  static Status fromString(String value) {
    return Status.values.firstWhere(
      (e) => e.name == value,
      orElse: () => Status.pending,
    );
  }
}

// JsonSerializable과 함께
@JsonEnum(valueField: 'name')
enum Status {
  pending,
  approved,
  rejected,
}

Enum 확장

extension StatusExtension on Status {
  IconData get icon {
    return switch (this) {
      Status.pending => Icons.hourglass_empty,
      Status.approved => Icons.check_circle,
      Status.rejected => Icons.cancel,
    };
  }
}

Sealed Class vs Enum

특징 Enum Sealed Class
각 값에 다른 필드 X O
인스턴스 생성 고정 자유
패턴 매칭 O O

언제 뭘 쓸까: 모든 값이 같은 구조면 Enum, 값마다 다른 데이터가 필요하면 Sealed Class

관련 문서