Dart 2.17 주요 변화 3가지 살펴보기

2 분 소요

이번 2022 구글 I/O에서 플러터가 3.0으로 버전업되면서 다트도 2.17로 버전업되었다. 다트의 주요 변화 3가지를 살펴보자.

1. 향상된 enum

가장 눈에 띄는 변화는 enum이다. 기존 enum에는 필드, 생성자, 메소드 등을 넣지 못해 extension을 이용하여 복잡하게 구현을 했어야 했다. 예를 들어 Water라는 열거형이 있고 해당 값의 온도를 나타내는 정수를 얻기 위해서는 아래와 같이 구현해야 했다.

기존 방식

enum Water {
  frozen,
  lukewarm,
  biling,
}

extension on Water {
  int get tempInFahrenheit {
    switch (this) {
      case Water.frozen: return 32;
      case Water.lukewarm: return 100;
      case Water.boiling: return 212;
    }
  }
}

이는 새로운 다트에서 생성자와 필드를 이용하여 아래처럼 굉장히 간단하게 구현 가능하다.

새로운 방식

enum Water {
  frozen(32),
  lukewarm(100),
  boiling(212);

  final int tempInFahrenheit;
  const Water(this.tempInFahrenheit);
}

toString()을 오버라이드하는 것도 가능하다.

@override
String toString() => "The $name water is $tempInFahrenheit F.";

2. Super 이니셜라이저

기존에는 상속을 받은 서브 클래스의 생성자에서 수퍼 클래스의 생성자를 이용해야지만 수퍼 클래스의 필드를 초기화 가능했다. 이번 업데이트로 마치 this 키워드처럼 super 키워드를 이용하여 낭비되는 코드 없이 바로 초기화가 가능하다.

기존 방식

class OutlinedButton extends ButtonStyleButton {
  const OutlineButton({
    Key? key,
    required VoidCallback? onPressed,
    VoidCallback? onLongPress,
    ValueChanged<bool>? onHover,
    ValueChanged<bool>? onFocusChange,
    ButtonStyle? style,
    FocuseNode? focusNode,
    bool autofocus = false,
    Clip clipBehavior = Clip.none,
    required Widget child,
  }) : super(
    key: key,
    onPressed: onPressed,
    onLonpress: onLongPress,
    ...

새로운 방식

class OutlinedButton extends ButtonStyleButton {
  const OutlineButton({
    super.key,
    required super.onPressed,
    super.onLongPress,
    super.onHover,
    super.onFocusChange,
    super.style,
    super.focusNode,
    super.autofocus = false,
    super.clipBehavior = Clip.none,
    required Widget super.child,
  });
...

위의 코드를 보면 코드가 엄청 간결해진 것을 볼 수 있다.

3. Named args를 순서 상관없이 전달 가능

기존에는 매개변수를 전달할 때 named가 아닌 값들을 먼저 전달하고 마지막에 named인 값들을 전달해야했다. 하지만 이제는 순서 상관없이 전달이 가능하다. 이는 콜백함수와 같은 매개변수를 전달할 때 콜백함수 다음에 전달되는 매개변수가 눈에 잘 들어오지 않는 가독성 문제를 해결해준다.

아래는 List<T>.generate 생성자의 예이다. growable이 전달되는 함수의 밑에 위치하여 코드를 읽을 때 놓치기 쉽다.

기존 방식

final factorials = List<int>.generate(
  10,
  (int i) {
    if (i == 0) {
      return 1;
    } else {
      var result = 1;
      for (var r = 2; r <= i; ++r) {
        result *= r;
      }
      return result;
    }
  },
  growable: true,
);

새로운 방식

growable이 중간에 위치하여 훨씬 눈에 잘 들어오는 모습이다.

final factorials = List<int>.generate(
  10,
  growable: true,
  (int i) {
    if (i == 0) {
      return 1;
    } else {
      var result = 1;
      for (var r = 2; r <= i; ++r) {
        result *= r;
      }
      return result;
    }
  }
);

참조

Dart 2.17: Productivity and integration - Michael Thomsen

태그:

카테고리:

업데이트:

댓글남기기