0116_코드팩토리 플러터 프로그래밍 cpt4
4장
다트 3.0 신규 문법
4.1 레코드
record는 다트 3.0 부터 사용할 수 있는 새로운 타입. positional paramter 나 named parameter 중 한 가지 방식을 적용하여 사용할 수 있음. 두 방식 모두 괄호 안에 쉼표로 구분하여 작성
포지셔널 파라미터를 이용한 레코드
void main(){
//정확한 위치에 어떤 타입이 값이 입력될지 지정할 수 있음.
//(String, int) 는 첫번째 값이 String 타입이고 두 번쨰 값은 int type
(String, int) minji = ('민지', 20);
}
레코드에 정의할 수 있는 값의 갯수에는 제한이 없음.
레코드의 무든 값을 사용하지 않고 특정 순서의 레코드 값을 가져오고 싶다면 ‘$’ 사용
print(minji.$1); // 20
네임드 파라미터를 이용한 레코드
네임드 파라미터는 포지셔널 파라미터와는 다르게 입력 순서를 지킬 필요가 없음. 다만 네임드 파라미터는 소괄호에 중괄호를 중첩하여 타입과 변수 이름을 쉼표로 구분하고 명시해줘야 함
void main(){
({String name, int age}) minji = (name:'민지', age : 20);
print(minji) // (age:20, name:'민지')
}
4.2 구조분해
4.2.2 리스트에서 스프레드 연산자를 이용한 구조 분해 사용 예제
final numbers = [1,2,3,4,5]
// 스프레트 연산자를 이용하면, 중간값 버릴 수 있음
final [x,y,...,z ] = numbers;
print(x) // 1
print(z) // 5
4.2.3 맵에서의 구조분해 사용 예정
final minjiMap = {'name':'민지', 'age':19}
final {'name':name, 'age':age} = minjiMap;
4.2.3 클래스에서의 구조분해 사용 예정
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,
})
}
4.3 switch 문
- 스위치 표현식
- 패턴 매칭
- 완전 확인
- 가드 절
4.3.1 표현식 기능
코드는 expression, statement 로 나눌 수 있음. expression 은 어떤 값을 만들어 내는 코드. ex) 1+1 는 값 2를 만드는 expression 임. 이처럼 expression 이 평가되면 새로운 값을 생성하거나 기존 값을 참조함
statement는 기본 단위이자 가장 작은 코드 실행단위로 명령문 즉, 컴퓨터에 내리는 명령어. ex) 선언문, 할당문, 반복문 ex) var a = 3
다트 3.0 부터는 switch 문을 함수처럼 사용하여 직접 값을 반환 받을 수 있는 절 기능이 추가됨
void main(){
String dayKor = '월요일';
// switch 문이 함수처럼 값을 반환함.
String dayEnglish = switch(dayKor){
'월요일' =>'Monday'
// _는 default 와 같은 의미로 사용됨
_ => 'Not found',
}
print(dayEnglish) // Monday 출력
4.3.2 패턴매칭
switch 문을 사용해서 더욱 복잡한 조건을 형성할 수 있음
void switcher(dynamic anything){
switch(anything){
//정확히 'aaa'문자열만 매치함.
case 'aaa':
print('match aaa')
break;
// 3개 값이 들어있는 리스트를 모두 매치함.
case [_,_,_]:
print('match [_,_,_')
break;
// 첫번째와 두번째 값에 int가 입력된 리스트 매치
case [int a, int b]
print('match [int $a, int$b]')
break;
4.3.3 엄격한 검사
exhaustiveness checking 은 코드가 입력 받을 수 있는 모든 조건을 전부 확인하고 있는지 체크하는 기술
void main(){
//val 에 입력받을 수 있는 값은 true, false, null
bool? val;
// null 조건을 입력하지 않았기 때문에 non exhaustive switch statment 에러 발생!
// null case 를 추가하거나, default case 를 추가해야함.
switch(val){
case true:
print(true)
case false:
print(false)
}
}
4.3.4 보호구문
switch 문에는 when 키워드로 보호 구문을 추가할 수 있도록 업데이트
void main(){
(int a, int b) val = (1, -1)
switch(val){
// when 키워드 뒤에 오는 조건이 true 를 반환하지 않으면 case 매치가 안됨.
case(1, _) when val.$2 > 0:
print('1, _');
break;
default:
print('default');
4.4 클래스 제한자
class modifier 추가됨
- base
- final
- interface
- sealed
- mixin
모든 class 제한자는 class 키워드 앞에 명시
클레스 제한자를 명시한 클래스는 해당 클래스를 사용하는 파일이 아닌 다른 파일에 선언해야 정상적으로 기능 작동
4.4.1 base 제한자
base 키워드를 사용하게 되면 해당 클래스는 오직 상속만 할 수 있게 됨
그리고 base 클래스가 아닌 자식 클래스는 꼭 base, final 또는 sealed 제한자를 함께 사용해줘야 함
base 클래스는 implement가 불가능함
4.4.2 final 제한자
final 제한자를 사용하면 같은 파일에서 상속과 재정의(implement) 를 할 수 있지만 외부 파일에서는 할 수 없음. 그리고 final 제한자는 base 제한자의 기능을 모두 포함
4.4.3 interface 제한자
클래스를 외부 파일에서 상속받지 못하고 재정의만 할 수 있도록 제한하는 역할
상속 = extends
재정의 = implement
4.4.4 sealed 제한자
sealed 클래스를 외부에서 상속, 재정의 , 그리고 인스턴스화 할 수 없도록 제한함.
4.4.5 mixin 제한자
일반 Mixin 같은 역할을 하면서도 상속이 가능함
Leave a comment