Enum이 뭐고, Enhanced Enum은 왜 쓸까?

2024. 8. 12. 11:44·Flutter/Dart

Enum

- 열거형, Enum에 있는것들은 상수다.

- 유한한 상수 집합이라는 특징을 가지고 있다.

- UpperCamelCase로 작성해야됨 

enum Color { red, green, blue }

 

Color.red : 이 자체가 Color type값 

Color.red.name : red 라는 String (String 값이 필요하면 name으로 읽으면 됨) 

Color.red.index : red 가 위치한 index, 0부터 시작 

Color.vlaues : iterable하게 enum을 쓸 수  있다. list화 시켜주는거임 

 

map,list 와 달리 enum을 쓰는 이유
list. map은 리스트 맵이 나열된 값을 쓰는 경우가 꽤 많은데, 이런 일반적인 Map,list를 쓰면 개발자가 '해석'해야됨 (비용 낭비죠) enum을 쓰면 좀 더 명확하게 알 수 있어요. 

 

 

Enhanced enum

- constructor, method 사용가능 , const constructor 필수다 

enum Vehicle {
 car(tires: 4, passengers: 5);
 
 // porperty 선언: 반드시 final로 선언해야 함
 fianl int tires;
 final int passengers;
 
 //Constructor, const필수
 const Vehicle({
  required this.tires,
  required this.passengers
 });
 
 //속성으로 값을 쓸 때 Enum에서 method를 많이 쓴다.
 String get isMultiPassenger => (passengers >=2 ) ? "가능" : "불가능";
}

 

 

근데 이걸.. 왜 쓸까?

그냥 class쓰면 안될까? 왜 굳이 enhanced Enum을 쓸까.

결국 개념이 뚜렷한 enum을 사용함으로써 비용절감을 하기위함 아닐까 생각해본다.. 길게 풀어서 설명해보자

 


1. 아까 말했던 개념차이
- Enum은 제한된 값의 집합을 나타내는 데 사용됨. 예를 들어, 요일, 방향(북, 남, 동, 서), 상태(성공, 실패) 등의 개념은 유한한 선택지를 가진다.  따라서 열거형은 이 제한된 값들을 표현하는 데 적합하며, 이를 사용하면 코드에서 명확하게 특정 값들만 사용된다는 의미를 전달할 수 있게 된다.
- 반면, Class는 상태와 행동을 포함하는 객체를 정의하는 데 사용되며, 특정 개념의 집합을 제한하지 않음. 클래스는 훨씬 더 복잡한 구조를 가질 수 있으며, 개념이 제한된 값 집합이 아니라는 점에서 Enum과 차이가 있음.

 

2.간결함과 명확성
Enhanced Enums는 특정 값 집합과 이 값들에 대한 동작이나 속성을 정의할 때 클래스를 사용하는 것보다 코드가 더 간결하고 명확해짐. 예를 들어, 방향(Direction)을 나타내는 enum코드를 구현해보자 ㄱㄱ 

enum Direction {
  north,
  south,
  east,
  west;

  void printDescription() {
    switch (this) {
      case Direction.north:
        print("North direction");
        break;
      case Direction.south:
        print("South direction");
        break;
      case Direction.east:
        print("East direction");
        break;
      case Direction.west:
        print("West direction");
        break;
    }
  }
}


이 예제에서 각 방향에 대한 동작을 정의하는 방법이 간단하고 직관적임. 클래스를 사용하여 동일한 기능을 구현할 수 있지만, 코드가 더 복잡해질 수 있지 않을까 싶다. 

3. switch 문에서의 사용
`enum`은 `switch` 문과 매우 잘 통합됨. Dart에서는 `switch` 문에서 `enum`의 모든 케이스를 다루지 않으면 경고를 주는 기능이 있음. 이는 코드의 안전성과 유지보수성을 높이는 데 도움이 된다 ( Swift 와 비슷하네요 )

void describe(Direction direction) {
  switch (direction) {
    case Direction.north:
    case Direction.south:
    case Direction.east:
    case Direction.west:
      print("It's a direction.");
      break;
  }
}


클래스를 사용했다면, 비슷한 패턴 매칭 기능을 구현하기 위해 더 복잡한 로직이 필요할 수 있지 않을까?

4. Enum만의 고유 기능 
Enhanced Enums는 클래스로 구현하기 어려운 몇 가지 고유한 기능을 제공한다고 한다(by ChatGPT 4o). 예를 들어, 열거형 상수 자체를 사용할 수 있는 유연성이나, 각 상수에 대해 다른 값을 연관시키는 방식 등이 있음 ( 이거 역시 굉장히 Swift와 유사하다 )

 

연관값 예제를 보며 이해하자. 

enum HttpStatus {
  ok(200, 'OK'),
  notFound(404, 'Not Found'),
  internalServerError(500, 'Internal Server Error');

  final int code;
  final String description;

  const HttpStatus(this.code, this.description);

  void handleStatus() {
    switch (this) {
      case HttpStatus.ok:
        print("Request was successful: $description");
        break;
      case HttpStatus.notFound:
        print("Error: $description");
        break;
      case HttpStatus.internalServerError:
        print("Server error: $description");
        break;
    }
  }
}

void main() {
  HttpStatus status = HttpStatus.notFound;
  status.handleStatus();
  // 출력: Error: Not Found
}

어플리케이션에서 HTTP 요청의 결과를 처리할 때, 다양한 HTTP 상태 코드에 따라 다른 행동을 해야 할 때가 있다. 고럴 때 요런 코드를 작성해 주면 조금 더 쉽게 결과 값을 낼 수 있지 않을까 싶다. 

 

+) 

Enum은 인스턴스를 생성하나?

답 : Dart의 enum은 언어 자체에서 각 항목에 대해 싱글톤 인스턴스를 생성하므로, 열거형 항목을 참조할 때마다 동일한 인스턴스에 접근하게 됩니다.

이는 enum의 각 항목이 고유하고 동일한 상태를 유지함을 보장합니다.

 


 

앞으로 플러터 앱에서 Enum을 어떤식으로 사용하게 될진 모르겠지만 개념을 확실히 짚고 감으로써 도움이 되리라 생각한다. 추가 할 내용이 있으면 천천히 추가하는 것으로 ~

 

'Flutter > Dart' 카테고리의 다른 글

멤버 변수 vs 상태  (0) 2024.10.14
fromMap을 사용해 map데이터 쉽게 사용하기  (0) 2024.09.19
Stream, Future 둘의 차이점은 뭐지?  (2) 2024.08.12
Call by Reference, Call by Value, 깊은 복사, 얕은 복사 in Dart  (2) 2024.08.07
자꾸 헷갈리는 Const & Final / Var & Dynamic 정리  (0) 2024.08.07
'Flutter/Dart' 카테고리의 다른 글
  • fromMap을 사용해 map데이터 쉽게 사용하기
  • Stream, Future 둘의 차이점은 뭐지?
  • Call by Reference, Call by Value, 깊은 복사, 얕은 복사 in Dart
  • 자꾸 헷갈리는 Const & Final / Var & Dynamic 정리
복복씨
복복씨
  • 복복씨
    정리노트
    복복씨
  • 전체
    오늘
    어제
    • 분류 전체보기 (113)
      • 개발새발자 (20)
        • 의 삶 (6)
        • 의 회고 (9)
        • 의 낙서장 (5)
        • 영어 (0)
      • Flutter (4)
        • 새싹 (5)
        • Dart (8)
        • Flutter (13)
        • iOS 에서 Flutter 로 전환하며 (2)
        • 챗지피티랑놀.기 (2)
        • 하루 한 입 플러터 (1)
      • CS (7)
        • 짤막지식 (6)
      • IOS (6)
        • Swift (0)
        • UIKit (1)
        • SwitUI (4)
      • 머신러닝-딥러닝 (28)
        • 논문리뷰 (3)
        • study (16)
        • Kaggle (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    FLUTTER
    getit
    flutter lottie
    깊은참조
    IOS
    용산캠
    시그널링데이터
    플러터 새싹
    테킷 앱스쿨
    새싹 플러터
    iOS 개발자
    새싹 용산
    플러터 di
    플러터
    테킷
    swiftui 플러터
    flutter 애니메이션
    한주 회고
    코드 결합도
    정말 최고의 유튜바
    핫 리로드
    부트캠프
    사그널링서버
    부트캠프 떠돌이
    initState()
    Flutter Lifecycle
    새싹
    dart
    멋쟁이 사자처럼
    왜 글쓸 때랑 글쓴 후랑 코드 색감이 다르게 나오지?
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
복복씨
Enum이 뭐고, Enhanced Enum은 왜 쓸까?
상단으로

티스토리툴바