스터디/[코드팩토리의 플러터 프로그래밍] (2024)

[코드팩토리의 플러터 프로그래밍] 4장. 다트 3.0 신규 문법

ttoance 2024. 7. 21. 09:44

1. 레코드

1) 포지셔널 파라미터 : 표시한 타입 순서를 지켜야함 

void main() {
  // 정확한 위치에 어떤 타입의 값이 입력될 지 지정 가능
  (String, int) minji = ('민지', 20);
  
  print(minji);
  
  // 특정 순서의 레코드 값 가져오고 싶다면 $ 사용 
  print(minji.$1);
  print(minji.$2);
}

 

실행화면 >>

 

2) 네임드 파라미터 : 입력 순서 지킬 필요 없지만 타입과 변수 이름 쉼표로 구분하고 명시해줘야함 

void main() {
  // 네임드 파라미터 형태로 record 선언
  ({String name, int age}) minji = (name: '민지', age: 20);
  
  print(minji);
}

 

실행화면 >>

 

2. 구조 분해 

1) 리스트에서의 구조 분해 사용 

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

 

실행화면 >>

 

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

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

 

실행화면 >>

 

 

3) 맵에서의 구조 분해 사용 

void main() {
  final minjiMap = {'name': '민지', 'age': 19};
  final {'name': name, 'age': age} = minjiMap;
  
  print('name : $name');
        
}

 

4) 클래스에서의 구조 분해 사용 

void main() {
  final minji = Idol(name: '민지', age: 19);
  
  // 구조 분해 
  final Idol(name: name, age: age) = minji;
  
  print(name);
}

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

 

실행화면 >>

 

 

3. switch문 

void main() {
  String dayKor = '월요일';
  
  // switch문이 함수처럼 값 반환
  String dayEnglish = switch (dayKor) {
      // '=>'를 사용하면 조건에 맞출때 값 반환..
      '월요일' => 'Monday',
      '화요일' => 'Tuesday',
      _ => 'Not Fount'
  };
  
  print(dayEnglish);
}

 

실행화면 >>

 

+ 패턴 매치 

void switcher(dynamic anything) {
  switch (anything) {
    // 정확히 'aaa'만 매칭 
    case 'aaa':
      print('match : aaa');
      break;
    // [1,2] 리스트만 매치
    case [1,2]:
      print('match: [1,2]');
      break;
    // 3개 값이 들어있는 리스트 모두 매치
    case [_,_,_]:
      print('match: [_,_,_]');
      break;
    // 첫번째와 두 번째 값에 int가 입력된 리스트 매치 
    case [int a, int b]:
      print('match: [int $a. int $b');
      break;
    // 아무것도 매치되지 않을 경우 
    default:
      print('no match');
      
  }
}

 

+ 보호 구문 : when 키워드로 boolean 반환할 조건을 case 문에 추가할 수 있음. 

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

 

실행 화면 >>

 

4. 클래스 제한자 

1) base 제한자 : base 클래스의 기능 강제하는 제한자. 해당 클래스는 오직 상속만 할 수 있음 

base class Parent{}

base class Child extends Parent{}

 

2) final 제한자 : 같은 파일에서 상속과 재정의 가능하지만 외부파일에서는 할 수 없음. 

3) interface 제한자 : 클래스를 외부 파일에서 상속 받지 못하고 재정의만 할 수 있도록 제한 

4) sealed 제한자 : 클래스를 파일 외부에서 상속, 재정의, 인스턴스화 할 수 없음

5) mixedin 제한자 : 일반 mixin 역할 하면서 상속할 수 있음 

 

참고 문서링크 >> Class modifiers | Dart

 

Class modifiers

Modifier keywords for class declarations to control external library access.

dart.dev

반응형