[플러터] 4. 다트 3.0 신규 문법

Jun·2024년 2월 19일
0

다트 언어 3.0 버전 이상부터 새로운 문법이 추가되었습니다.

레코드

void main() {
  (String, int) minji = ('민지', 20);
  print(minji); // ('민지', 20)
  print(minji.$1); // 민지
  print(minji.$2); // 20
}

네임드 파라미터를 이용하여 레코드를 정의할 수 있습니다.

void main() {
  ({String name, int age}) minji = (name: '민지', age: 20);
}

구조 분해

void main() {
  final [minji, haerin] = ['민지', '해린'];
  final [x, y, ..., z] = [1, 2, 3, 4, 5, 6, 7, 8, 9]; // x: 1, y: 2, z: 9
  final {'name': name, 'age': age} = {'name': '민지', 'age': 20}; // name: 민지, age: 20
  final Idol(name: name, age: age) = Idol(name: '민지', age: 20); // name: 민지, age: 20
}

switch 문

3.0 이상부터 스위치 표현식, 패턴 매칭, 엄격한 검사, 보호 구문 네가지가 추가되었습니다.

표현식 기능

void main() {
  String dayKor = '월요일';
  
  String dayEnglish = switch (dayKor) {
    '월요일' => 'Monday',
    '화요일' => 'Tuesday',
    _ => 'Not Found',
  };
  
  print(dayEnglish); // Monday
}

패턴 매칭

void switcher(dynamic anything) {
  switch (anything) {
    // 정확히 a만 매칭
    case 'a':
      print('match: a');
      break;
    // 원소개 3개인 배열을 매칭  
    case [_, _, _]:
      print('match [_, _, _]');
      break;
    // 두 원소가 모두 int인 배열을 매칭
    case: [int a, int b]:
      print('match [int, int]');
      break;
    default:
      print('default');
  }
}

엄격한 검사

3.0부터는 코드가 입력받을 수 있는 모든 조건을 전부 확인하고 있는지 체크하는 기술입니다.

void main() {
  bool? val;
  
  // null 조건이 없기 때문에 에러 발생
  switch(val) {
    case true:
      print('true');
    case false:
      print('false);
  }
}

보호 구문

switch문에는 when 키워드로 보호 구문을 추가할 수 있도록 업데이트되었습니다.
when 키워드는 boolean으로 반환할 조건을 각 case문에 추가할 수 있으며 when 키워드 뒤에 오는 조건이 true를 반환하지 않으면 case 매치가 안됩니다.

void main() {
  (int a, int b) val = (1, -1);
  
  switch (val) {
    case (1, _) when val.$2 > 0:
      print('1, _');
      break;
    default:
      print('default');
  }
} 

클래스 제한자

다트 3.0 버전에는 base, final, interface, sealed, mixin 제한자가 추가되었습니다. 클래스 제한자를 명시한 클래스는 해당 클래스를 사용하는 파일일 아닌 다른 파일에서 선언해야 정상적으로 작동합니다.

base 제한자

base 제한자는 클래스의 기능을 강제하는 제한자입니다.
base 키워드를 사용한 클래스는 오직 상속만 가능합니다.
그리고 자식 클래스는 꼭 base, final, sealed 중 하나의 제한자와 함께 사용해야 합니다.

// a.dart
base class Parent{}
// b.dart
import 'a.dart';

Parent parent = Parent();

base class Child extends Parent{}

// 에러가 발생합니다. (base, sealed, final 제한자 중 하나가 필요합니다.)
class Child2 extends Parent{}
// base 클래스는 implements가 불가능합니다.
class Child3 implements Parent{}

final 제한자

final 제한자는 상속과 implements를 할 수 있지만 외부 파일에서는 할 수 없습니다.
그리고 base의 모든 기능을 포함합니다. (하위 자식들이 제한자가 강제되는 것도)

// a.dart
final class Parent{}
// b.dart
impor 'a.dart';

Parent parent = Parent();
// 불가능
class Child extends Parent{}
class Child implements Parent{}

interface 제한자

interface 제한자는 implements만 할 수 있습니다.

// a.dart
interface class Parent{}
// b.dart
import 'a.dart';

// 인스턴스화 가능
Parent parent = Parent();

class Child implements Parent{}

sealed 제한자

sealed는 파일 외부에서 상속, implements, 인스턴스화 모두 불가능합니다.

mixin 제한자

mixin class MixinExample{}

class Child with MixinExample{}
// 상속도 가능
class Child2 extends MinxinExample{}

《Must Have 코드팩토리의 플러터 프로그래밍 2판》의 스터디 내용 입니다.

profile
HiHi

0개의 댓글