[Dart] Enum(Dart 2.17)

작성 날짜:

최근 업데이트 날짜:

오늘은 Dart의 enum에 대해 정리를 해보려고 한다. Dart 2.17 버전이 나오기 전까지는 enum의 사용성이 좋지 않았다. 하지만 2.17 버전부터는 enum의 확장성이 class처럼 꽤 좋아졌다.

사실 2.17 버전이 나온 건 작년 봄 쯤이라 그때 정리를 해야했었다… 그런데 일 때문에 정신이 없었어서 정리를 못했고 요새 여유가 좀 생긴 김에 정리해본다.

Dart 2.17에서 Enum의 변경점

2.17 이전의 Dart에서는 enum에 메소드나 변수를 설정할 수 없었다. 그런데 이 점은 사실 되게 불편한 점들 중 하나였다고 생각한다. enum에 관련된 값이나 메소드가 필요한 경우가 꽤 많았는데 이를 해결하려면 extension을 활용하는 다소 귀찮은 방법을 사용해야했기 때문이다.

이에 대해서 예시를 통해 한번 알아보자.

기존

만약 비디오 화질에 관한 enum이 있다고 해보자.

enum VideoQuality {
  hd,
  fhd,
  qhd,
}

원래는 enum에 고유 값을 할당하거나, string으로 변환해주는 함수를 선언할 수 없었다.

그래서 이런 경우에는 extension을 사용해야했다. 아래는 extension을 통해 각 화질의 p(Progressive)와 string으로 변환해주는 함수를 선언한 것이다.

extension VideoQualityEx on VideoQuality {
  int qualityToProgressive(VideoQuality videoQuality) {
    switch(videoQuality) {
      case VideoQuality.hd:
        return 720;
      case VideoQuality.fhd:
        return 1080;
      case VideoQuality.qhd:
        return 1440;
    }
  }
  
  String convertToString() => "The $name video is ${qualityToProgressive(this)}p.";
}

이렇게 하면 우리가 원하는대로 기능은 돌아가지만, enum 관련 값과 함수가 enum 외부에 선언되기 때문에 복잡하고 가독성도 떨어진다.

변경

Dart 2.17에서는 이 부분이 편리하게 변경되었다. 아래 코드는 이전 코드와 동일하게 작동하는 Dart 2.17 버전 코드다.

enum VideoQuality {
  hd(720),
  fhd(1080),
  qhd(1440);
  
  final int progressive;
  
  const VideoQuality(this.progressive);
  
  @override
  String toString() => "The $name video is ${progressive}p.";
}

enum에서도 constructor를 사용할 수 있게 되어서 생성자를 통해 progressive를 받도록 만들었다. 또한 내부에 함수를 선언할 수 있게 되면서 toStringoverride하는 것도 가능해진 것을 확인할 수 있다.

Dart pad

기존

변경

태그:

카테고리:

최근 업데이트 날짜:

댓글남기기