Enum

하요·2024년 7월 8일
0

Dart에서 고정된 상수 값을 효과적으로 관리하는 방법: Enum

Dart에서 enum(열거형)은 고정된 상수 값의 집합을 나타내기 위해 사용되는 특수한 클래스입니다. 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 문을 사용하여 해당 값에 따라 다른 출력을 합니다.

주요 특징

  1. 기본 값: enum은 0부터 시작하는 인덱스를 기본 값으로 가집니다.

    void main() {
      print(Color.red.index); // 출력: 0
      print(Color.green.index); // 출력: 1
      print(Color.blue.index); // 출력: 2
    }
    
  2. values 속성: enum의 모든 값을 리스트로 가져올 수 있습니다.

    void main() {
      List<Color> colors = Color.values;
      print(colors); // 출력: [Color.red, Color.green, Color.blue]
    }
    
  3. 메소드 및 필드 추가: 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
    }
    

향상된 Enum

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;
}

향상된 Enum의 특징

  • 인스턴스 변수는 반드시 final이어야 합니다.
  • 모든 생성자는 상수여야 합니다.
  • 팩토리 생성자는 고정된 열거형 인스턴스 중 하나만 반환할 수 있습니다.
  • Enum은 자동으로 확장되며 다른 클래스를 확장할 수 없습니다.
  • index, hashCode, 동등 연산자 ==를 재정의할 수 없습니다.
  • values라는 이름의 멤버를 선언할 수 없습니다.
  • 모든 인스턴스는 선언의 시작 부분에 선언되어야 하며, 최소 하나의 인스턴스가 선언되어야 합니다.

관련 자료

profile
flutter 개발자(진)

0개의 댓글