Contents

열거 타입

열거 타입은 종종 enumerations, enums 으로도 불립니다. 이 타입은 정해진 수의 상수 값을 가지는 특별한 종류의 클래스 입니다.

간단한 enum 선언하기

열거 타입을 선언하고 싶다면, enum 키워드를 사용하고 열거하고 싶은 값들을 나열하세요:

enum Color { red, green, blue }

발전된 enum 사용하기

Dart는 필드, 메서드, 상수 생성자같이 수가 정해져 있는 상수 인스턴스가 있는 클래스를 선언하는 데 enum을 사용하는 것이 가능합니다.

발전된 enum을 선언하려면, [클래스][클래스]와 비슷하지만 몇 가지 다른 문법을 따라야 합니다.

  • mixins으로 추가되는 변수들까지 모든 인스턴스 변수들은 final로 선언되어야 합니다.
  • 모든 제너러티브 생성자 상수로 선언되어야 합니다.
  • Factory 생성자는 고정된 enum 인스턴스 중 하나만을 반환할 수 있습니다.
  • Enum이 자동으로 확장되므로 다른 클래스들은 Enum으로 확장될 수 없습니다.
  • index, hashCode, 항등 연산자 ==는 재정의할 수 없습니다.
  • value로 명명된 멤버는 enum에 선언될 수 없습니다. 만약 enum에 선언한다면, 자동으로 생성된 정적 value getter와 충돌합니다.
  • Enum의 모든 인스턴스들은 선언의 처음 부분에 선언되어야 하고 반드시 한 개 이상의 인스턴스가 선언되어야 합니다.

발전된 enum이 가지고 있는 인스턴스 메서드는 this를 사용하여 현재 enum 값을 참조할 수 있습니다.

다음은 다수의 인스턴스, 인스턴스 변수, getter 그리고 인터페이스를 가지는 발전된 enum의 예제 입니다:

enum Vehicle implements Comparable<Vehicle> {
  car(tires: 4, passengers: 5, carbonPerKilometer: 400),
  bus(tires: 6, passengers: 50, carbonPerKilometer: 800),
  bicycle(tires: 2, passengers: 1, carbonPerKilometer: 0);

  const Vehicle({
    required this.tires,
    required this.passengers,
    required this.carbonPerKilometer,
  });

  final int tires;
  final int passengers;
  final int carbonPerKilometer;

  int get carbonFootprint => (carbonPerKilometer / passengers).round();

  bool get isTwoWheeled => this == Vehicle.bicycle;

  @override
  int compareTo(Vehicle other) => carbonFootprint - other.carbonFootprint;
}

enum 사용하기

정적 변수에 접근하는 것 처럼 열거 값에 접근하면 됩니다:

final favoriteColor = Color.blue;
if (favoriteColor == Color.blue) {
  print('Your favorite color is blue!');
}

Enum의 각 값들은 index getter 메서드가 있습니다. 이 메서드는 0을 기준으로 인덱스된 위치 값을 반환합니다. 예를 들어, 첫 번째 값은 index 0을 가지고 두 번째 값은 index 1을 가집니다.

assert(Color.red.index == 0);
assert(Color.green.index == 1);
assert(Color.blue.index == 2);

열거 값의 리스트를 얻고 싶다면, enum의 values 상수를 사용하세요.

List<Color> colors = Color.values;
assert(colors[2] == Color.blue);

switch 구문에 enum을 사용해도 됩니다. 하지만 enum의 모든 값들을 처리하지 않으면 경고가 발생합니다:

var aColor = Color.blue;

switch (aColor) {
  case Color.red:
    print('Red as roses!');
    break;
  case Color.green:
    print('Green as grass!');
    break;
  default: // 이 처리가 없으면, 경고가 발생합니다.
    print(aColor); // 'Color.blue'
}

열거 값의 이름에 접근하고 싶다면, Color.blue'blue'처럼 .name 프로퍼티를 사용하면 됩니다:

print(Color.blue.name); // 'blue'

You can access a member of an enum value like you would on a normal object:

print(Vehicle.car.carbonFootprint);