본문 바로가기
Flutter for Beginners

Dart의 enum

by Andrew's Akashic Records 2025. 2. 19.
728x90

Dart

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을 사용할 때의 장점

  1. 가독성이 뛰어남
    → enum을 사용하면 코드의 의미가 명확해짐.
  2. 유효한 값만 사용 가능
    → const나 static const는 실수로 잘못된 값을 입력할 가능성이 있지만, enum은 정의된 값만 사용할 수 있음.
  3. 타입 안전성 보장
    → 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