728x90
Dart의 enum (열거형)
Dart의 enum(열거형)은 고정된 상수 값의 집합을 정의할 때 사용됩니다.
보통 상태(state)나 옵션(option) 값을 표현할 때 유용합니다.
1. enum 기본 문법
Dart에서 enum을 선언하는 방법은 다음과 같습니다.
(1) enum 선언
enum Color { red, green, blue }
void main() {
Color selectedColor = Color.green;
print(selectedColor); // Color.green
}
enum의 값은 Color.red, Color.green과 같이 사용됩니다.
(2) enum의 모든 값 가져오기
Color.values를 사용하면 enum에 정의된 모든 값을 가져올 수 있습니다.
void main() {
print(Color.values); // [Color.red, Color.green, Color.blue]
for (var color in Color.values) {
print(color);
}
}
출력 결과:
Color.red
Color.green
Color.blue
values를 사용하면 모든 enum 값을 리스트(List)처럼 활용 가능합니다.
2. enum의 활용
(1) switch-case 문에서 enum 사용
enum을 switch-case 문과 함께 사용하면 가독성이 좋아집니다.
enum Weather { sunny, rainy, cloudy }
void main() {
Weather today = Weather.sunny;
switch (today) {
case Weather.sunny:
print("오늘은 맑은 날입니다.");
break;
case Weather.rainy:
print("오늘은 비가 옵니다.");
break;
case Weather.cloudy:
print("오늘은 흐린 날입니다.");
break;
}
}
enum은 switch-case에서 조건문을 더 직관적으로 만들 수 있습니다.
(2) enum을 문자열로 변환
void main() {
Color selectedColor = Color.blue;
print(selectedColor.toString()); // Color.blue
print(selectedColor.name); // blue
}
- toString()을 사용하면 "Color.blue" 형식으로 변환됩니다.
- Dart 2.15 이상에서는 name 속성을 사용하여 "blue" 같은 순수한 문자열 값을 가져올 수 있습니다.
(3) enum의 인덱스(index) 가져오기
각 enum 값은 자동으로 0부터 시작하는 인덱스(index) 를 가집니다.
void main() {
print(Color.red.index); // 0
print(Color.green.index); // 1
print(Color.blue.index); // 2
}
.index를 사용하면 해당 enum의 위치를 가져올 수 있습니다.
3. enum의 확장 (Dart 2.17 이상)
Dart 2.17부터 enum은 메서드와 속성을 가질 수 있는 확장된 기능을 제공합니다.
(1) enum에 속성 추가
enum Size {
small(30),
medium(50),
large(70);
final int value;
const Size(this.value);
}
void main() {
print(Size.small.value); // 30
print(Size.medium.value); // 50
print(Size.large.value); // 70
}
const 생성자를 사용하여 enum 값에 추가적인 속성을 부여할 수 있습니다.
(2) enum에 메서드 추가
enum Status {
success,
error,
loading;
String get message {
switch (this) {
case Status.success:
return "작업이 성공했습니다!";
case Status.error:
return "오류가 발생했습니다!";
case Status.loading:
return "로딩 중입니다...";
}
}
}
void main() {
print(Status.success.message); // 작업이 성공했습니다!
print(Status.error.message); // 오류가 발생했습니다!
}
get 키워드를 사용하여 enum에 동작(메서드)을 추가할 수 있음.
(3) enum을 활용한 객체 생성
enum AnimalType { mammal, bird, reptile }
class Animal {
String name;
AnimalType type;
Animal(this.name, this.type);
void describe() {
print("$name는 ${type.name}입니다.");
}
}
void main() {
Animal dog = Animal("강아지", AnimalType.mammal);
Animal parrot = Animal("앵무새", AnimalType.bird);
dog.describe(); // 강아지는 mammal입니다.
parrot.describe(); // 앵무새는 bird입니다.
}
객체와 enum을 함께 사용하여 의미 있는 데이터를 표현할 수 있습니다.
4. enum vs const와 static const
(1) enum을 사용할 때의 장점
- 가독성이 뛰어남
→ enum을 사용하면 코드의 의미가 명확해짐. - 유효한 값만 사용 가능
→ const나 static const는 실수로 잘못된 값을 입력할 가능성이 있지만, enum은 정의된 값만 사용할 수 있음. - 타입 안전성 보장
→ enum은 특정 타입으로 강제되므로, 타입 오류를 방지할 수 있음.
(2) const 또는 static const와 비교
class Colors {
static const String red = "red";
static const String green = "green";
static const String blue = "blue";
}
void main() {
String color = Colors.red;
print(color); // red
}
static const를 사용하면 enum 없이도 유사한 기능을 구현할 수 있지만, 유효한 값인지 보장할 수 없음.
void main() {
String color = "yellow"; // "yellow"는 정의된 색이 아님 (실수 가능)
}
enum을 사용하면 이러한 실수를 방지할 수 있음.
5. 결론
기능 | enum | const 또는 static const |
타입 안전성 | 유효한 값만 사용 가능 | 잘못된 값 입력 가능 |
가독성 | 의미가 명확함 | 그냥 문자열 |
속성 추가 | 가능 | 불가능 |
메서드 추가 | 가능 | 불가능 |
- enum은 상태, 옵션, 설정 값 등을 정의할 때 가장 적절한 방식입니다.
- enum을 활용하면 안전한 타입 체크, 의미 있는 코드 작성이 가능합니다.
- enum은 고정된 값의 집합을 정의할 때 사용됨.
- values를 사용하면 모든 enum 값을 리스트처럼 활용할 수 있음.
- switch-case 문과 함께 사용하면 가독성이 향상됨.
- name, index 속성을 활용하여 enum 값을 문자열 또는 숫자로 변환 가능.
- Dart 2.17부터 속성과 메서드를 추가할 수 있음.
728x90
'Flutter for Beginners' 카테고리의 다른 글
Dart의 제어문 (0) | 2025.02.20 |
---|---|
Dart의 연산자 (0) | 2025.02.20 |
Dart의 컬렉션(Collection) (0) | 2025.02.19 |
Dart의 dynamic 변수 타입 (0) | 2025.02.18 |
Dart 기초 문법 (0) | 2025.02.18 |