Skills/Flutter, Dart

[Dart] 3.0 업데이트 문법

개발자 윤구나 2024. 2. 5. 16:45

Dart 3.0 업데이트 문법 중 몇 가지만 정리해보았다.

 

1. Record

List를 좀 더 규격화해서 표현 할 수 있는 기능이다.

타입스크립트나 파이썬의 튜플과 같다고 보면 된다.

일반 괄호()를 이용해서 사용할 수 있다.

타입과 타입의 순서를 보장한다. name을 줄 수도 있다.

void main() {
  final result = nameAndAge({
    'name': '민지',
    'age':  20,
  });
  
  print(result);
  print(result.$1);
  print(result.$2);
  
  final result3 = getNewJeansWithType();
  
  for(final item in result3) {
    print(item.$1);
    print(item.$2);
  }
  
  final result4 = getNewJeansWithType2();
  
  for(final item in result4) {
    print(item.$1);
    print(item.$2);
  }
  
  final result5 = getNewJeansWithType3();
  
  for(final item in result5) {
    print(item.name);
    print(item.age);
  }
  
  final result6 = getMinji();
  
  print(result6);
}

// Record
// List를 좀 더 규격화해서 표현 할 수 있는 기능
// 타입스크립트나 파이썬의 튜플과 같다고 보면 됨
// 일반 괄호를 이용해서 사용 => ()
// 타입과 타입의 순서를 보장함
(String, int) nameAndAge(Map<String, dynamic> json) {
  return (json['name'] as String, json['age'] as int);
}

List<Map<String, dynamic>> getNewJeans() {
  return [
    {
      'name': '민지',
      'age': 20,
    },
    {
      'name': '해린',
      'age': 18,
    }
  ];
}

List<(String, int)> getNewJeansWithType() {
  return [
    (
      '민지',
      20,
    ),
    (
      '해린',
      18,
    )
  ];
}

// 이름을 붙여줄 수도 있음
List<(String name, int age)> getNewJeansWithType2() {
  return [
    (
      '민지',
      20,
    ),
    (
      '해린',
      18,
    )
  ];
}

List<({String name, int age})> getNewJeansWithType3() {
  return [
    (
      name: '민지',
      age: 20,
    ),
    (
      name: '해린',
      age: 18,
    )
  ];
}

(String name, String group, int age) getMinji() {
  return ('민지', '뉴진스', 19);
}

 

 

 

2. Destructuring

자바스크립트, 리액트를 사용한 경험이 있으므로

Destructuring은 아주 익숙하다.

void main() {
  final (name, age) = ('민지', 20);
  
  print(name);
  print(age);
  
  final newJeans = ['민지', '해린'];
  
  final [String a, String b] = newJeans; // 원한다면 타입을 넣어줄 수도 있음
  
  print(a);
  print(b);
  
  final numbers = [1, 2, 3, 4, 5, 6, 7, 8];
  
  final [x, y, ..., z] = numbers;
  // ... 중간 다 먹어버림
  // 한 곳에서만 사용 가능
  
  print(x); // 1
  print(y); // 2
  print(z); // 8
  
  // ... 으로 먹어버린 부분을 쓰고 싶다면?
  final [xx, yy, ...rest, zz] = numbers; // => spread/rest 문법
  
  print(xx); // 1
  print(yy); // 2
  print(zz); // 8
  print(rest); // [3, 4, 5, 6, 7];
  // 중간에 있던 값들을 다 가져옴
  
  // 값을 무시하는 방법
  // 여러 곳에서 사용 가능
  final [xxx, _, yyy, ...rest2, zzz, _] = numbers;
  print(xxx); // 1
  print(yyy); // 3
  print(zzz); // 7
  print(rest2); // [3, 4, 5, 6, 7];
  
  final minJiMap = {'name': '민지', 'age': 19};
  final {'name': name3, 'age': age3} = minJiMap;
  
  print(name3);
  print(age3);
  
  final minJiIdol = Idol(name: '민지', age: 19);
  
  final Idol(name: name4, age: age4) = minJiIdol;
  
  print(name4);
  print(age4);
}

class Idol {
  final String name;
  final int age;
  
  Idol({
    required this.name,
    required this.age,
  });
}

 

 

 

3. Pattern matching (+ switch case 수정사항)

void main() {
  // Validation(확인)
  
  final minJi = ('민지', 20);
  
  final (name as String, age as int) = minJi;
  
  print(name);
  print(age);
  
//   switcher('aaa');
//   switcher('bbb');
//   switcher(['1', '2']);
//   switcher([1, 2]);
//   switcher([1, 2, 3]);
//   switcher([4, 5, 6]);
//   switcher([4, 5, 6, 7]);
//   switcher([6, 9]);
//   switcher([6, '9']);
  switcher(7);
  switcher(17);
  
  print(switcher2(5, true));
  print(switcher2(7, true));
  print(switcher2(7, false));
  
  forLooper();
  ifMatcher();
}

void switcher(dynamic anything) {
  switch(anything) {
    case 'aaa':
      print('match: aaa');
    case ['1', '2']:
      print('match: [1, 2]');
    case [_, _, _]:
      print('match: [_, _, _]');
    case [int a, int b]:
      print('match: [int $a, int $b]');
    case < 10 && > 5: // 조건문도 사용 가능
      print('match: < 10 && > 5');
    default:
      print('no match');
  }
}

String switcher2(dynamic val, bool condition) => switch(val) {
    5 => 'match: 5',
    7 when condition => 'match 7 and true',
    _ => 'no match', // _: default 값
};

void forLooper() {
  final List<Map<String, dynamic>> members = [
    {
      'name': '민지',
      'age': 20,
    },
    {
      'name': '해린',
      'age': 19
    }
  ];
  
  for(final member in members) {
    print(member['name']);
    print(member['age']);
  }
  
  for(var {'name': name, 'age': age} in members) {
    print(name);
    print(age);
  }
}

void ifMatcher() {
  final minJi = {
    'name': '민지',
    'age': 20,
  };
  
  if(minJi case {'name': String name, 'age': int age}) {
    print(name);
    print(age);
  }
}

 

* 강의: 인프런 코드팩토리 Dart 언어