[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
를 받도록 만들었다. 또한 내부에 함수를 선언할 수 있게 되면서 toString
을 override
하는 것도 가능해진 것을 확인할 수 있다.
댓글남기기