Dart에서 enum
(열거형)은 고정된 상수 값의 집합을 나타내기 위해 사용되는 특수한 클래스입니다. enum
을 사용하면 코드의 가독성과 유지보수성을 높일 수 있습니다. 모든 enum
은 자동으로 Enum
클래스를 상속하며, 하위 클래스화, 구현, 믹스인, 또는 명시적으로 인스턴스화할 수 없습니다.
프로그래밍에서 상수는 코드의 가독성과 유지보수성을 높이는 중요한 요소입니다. 그러나 기존의 상수 정의 방식에는 가독성 문제, 유효성 검사 문제, 타입 안전성 부족 등의 문제가 있었습니다. 이러한 문제를 해결하기 위해 enum
이 도입되었습니다. enum
은 상수 값을 그룹화하여 열거형으로 정의하고, 이 값을 타입 안전하게 사용할 수 있도록 합니다.
다음은 enum
을 정의하고 사용하는 기본적인 예제입니다:
enum Color {
red,
green,
blue
}
void main() {
Color favoriteColor = Color.blue;
switch (favoriteColor) {
case Color.red:
print('Red!');
break;
case Color.green:
print('Green!');
break;
case Color.blue:
print('Blue!');
break;
}
}
위 예제에서 Color
라는 enum
을 정의하였고, red
, green
, blue
세 가지 값을 가집니다. main
함수에서는 favoriteColor
변수를 Color.blue
로 설정하고, switch
문을 사용하여 해당 값에 따라 다른 출력을 합니다.
기본 값: enum
은 0부터 시작하는 인덱스를 기본 값으로 가집니다.
void main() {
print(Color.red.index); // 출력: 0
print(Color.green.index); // 출력: 1
print(Color.blue.index); // 출력: 2
}
values 속성: enum
의 모든 값을 리스트로 가져올 수 있습니다.
void main() {
List<Color> colors = Color.values;
print(colors); // 출력: [Color.red, Color.green, Color.blue]
}
메소드 및 필드 추가: Dart 2.15 버전 이후, enum
에 메소드와 필드를 추가할 수 있습니다.
enum Color {
red(0xFF0000),
green(0x00FF00),
blue(0x0000FF);
final int value;
const Color(this.value);
void printValue() {
print('Value: $value');
}
}
void main() {
Color.red.printValue(); // 출력: Value: 16711680
Color.green.printValue(); // 출력: Value: 65280
Color.blue.printValue(); // 출력: Value: 255
}
Dart에서는 필드, 메서드 및 상수 생성자가 있는 클래스를 포함할 수 있는 향상된 enum
을 선언할 수 있습니다. 이를 통해 고정된 상수 인스턴스로 제한된 클래스를 선언할 수 있습니다.
다음은 필드, 게터 및 인터페이스를 구현한 향상된 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;
int compareTo(Vehicle other) => carbonFootprint - other.carbonFootprint;
}
final
이어야 합니다.Enum
은 자동으로 확장되며 다른 클래스를 확장할 수 없습니다.index
, hashCode
, 동등 연산자 ==
를 재정의할 수 없습니다.values
라는 이름의 멤버를 선언할 수 없습니다.