[Dart] 다트 3.0 신규 문법

찌니월드·2024년 2월 19일
0

📚 책 스터디

목록 보기
4/11
post-thumbnail

레코드

새로운 타입으로 네임드 파라미터와 포지셔널 파라미터가 있다.

포지셔널 파라미터를 이용한 레코드

  • 정확한 위치에 어떤 타입의 값이 입력될지 정할 수 있음
  • 레코드에 정의한 순서대로 타입을 입력하지 않으면 에러 발생
  • 레코드에 정의할 수 있는 값의 개수는 제한이 없음
void main() {
  (String, int) cocomong = ('코코몽', 12);
  // ('코코몽', 12) 출력
  print(cocomong);
}
  • 특정 순서의 레코드 값을 가져오고 싶다면 '$'를 사용하면 됨
void main() {
  (String, int, bool) cocomong = ('코코몽', 12, true);
  // 코코몽
  print(cocomong.$1);
  // 12
  print(cocomong.$2);
  // true
  print(cocomong.$3);
}

네임드 파라미터를 이용한 레코드

  • 입력 순서는 지킬 필요 없음
  • 소괄호에 중괄호를 중첩하여 타입과 변수 이름을 쉼표로 구분하고 명시해줘야 함
void main() {
  ({String name, int age}) cocomong = (name: '코코몽', age: 12);
  
  // (age: 12, name: 코코몽) 출력
  print(cocomong);
}

구조 분해

타입 내부의 각각의 값을 직접 추출해오는 문법이다.

리스트에서의 구조 분해 사용 예제

void main() {
  // final newJeans = ['민지', '해린'];
  // final minji = newJeans[0];
  // final haerin = newJeans[1];
  final [minji, haerin] = ['민지', '해린'];
  
  print(minji); // 민지
  print(haerin); // 해린
}

리스트에서의 스프레드 연산자를 이용한 구조 분해 사용 예제

void main() {
  final numbers = [1, 2, 3, 4, 5, 6, 7, 8];
  
  // 스프레드 연산자를 사용하게 되면 중간의 값들을 버릴 수 있다.
  final [x, y, ..., z] = numbers;
  
  print(x); // 1
  print(y); // 2
  print(z); // 8
}

맵에서의 구조 분해 사용 예제

void main() {
  final minjiMap = {'name': '민지', 'age': 19};
  // 위의 맵의 구조와 똑같은 구조로 구조 분해하면 된다.
  final {'name': name, 'age': age} = minjiMap;
  
  print('name: $name'); // name: 민지
  print('age: $age'); // age: 19
}

클래스에서의 구조 분해 사용 예제

void main() {
  final minji = Idol(name: '민지', age: 19);

  // 클래스의 생성자 구조와 똑같이 구조 분해하면 된다.
  final Idol(name: name, age: age) = minji;

  print(name); // 민지
  print(age); // 19
}

class Idol {
  final String name;
  final int age;

  Idol({
    required this.name,
    required this.age,
  });
}

switch문

표현식, 패턴 매칭, 완전 확인, 가드 절이 추가되어 다양한 방법으로 조건을 확인할 수 있다.

표현식 기능

void main() {
  String dayKor = '월요일';
  
  // switch문이 함수처럼 값을 반환한다.
  String dayEnglish = switch (dayKor) {
      // '=>' 를 사용하면 switch문 조건에 맞을 때 값을 반환할 수 있다.
      '월요일' => 'Monday',
      '화요일' => 'Tuesday',
      '수요일' => 'Wednesday',
      '목요일' => 'Thursday',
      '금요일' => 'Friday',
      '토요일' => 'Saturday',
      '일요일' => 'Sunday',
      // _는 default와 같은 의미로 사용된다.
      _ => 'Not Found',
  };
  
  print(dayEnglish); // Monday
}

패턴 매칭

void switcher(dynamic anything) {
  switch (anything) {
    case 'aaa':
      print('match: aaa');
      break;
    case [1, 2]:
       print('match: [1, 2]');
      break;
    case [_,_,_]:
       print('match: [_,_,_]');
      break;
    case [int a, int b]:
        print('match: [int $a, int $b');
      break;
    case (String a, int b):
      print('match: (String: $a, int $b)');
    default:
      print('no match');
  }
}

void main() {
  switcher('aaa'); // match: aaa
  switcher([1, 2]); // match: [1, 2]
  switcher([3, 4, 5]); // match: [_,_,_]
  switcher([6, 7]); // match: [int 6, int 7
  switcher(('민지', 19)); // match: (String: 민지, int 19)
  switcher(8); // no match
}

엄격한 검사

void main() {
  // val에 입력될 수 있는 값은 true, false, null이다.
  bool? val;
  
  // null 조건을 입력하지 않았기 때문에 non exhaustive swtich statement 에러가 발생
  // null case를 추가하거나 default case를 추가해야 에러가 사라진다.
  switch(val){
    case true:
      print('true');
    case false:
      print('false');
    default:
      print('default');
  };
}

보호 구문

  • 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'); // default
  }
}

참고

이 글은 골든래빗 《코드팩토리의 플러터 프로그래밍》의 스터디 내용 입니다.

profile
Front-End Developer

0개의 댓글