1. if
Dart는 선택적 else 절이 있는 if 문을 지원합니다. if 뒤의 괄호 안 조건은 부울로 평가되는 표현식이어야 합니다.
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
2. if-case
Dart if문은 패턴이 뒤따르는 case 절을 지원합니다.
패턴이 값과 일치하면 실행됩니다. 만족하지 않으면 else 분기로 진행합니다.
if (pair case [int x, int y]) {
print('Was coordinate array $x,$y');
} else {
throw FormatException('Invalid coordinates.');
}
if-case는 단일 패턴에 대해 일치시키고 구조를 해체하는 방법을 제공합니다. 여러 패턴에 대한 사용하려면 switch를 사용하세요.
3. switch
switch문은 case에 대한 값 식을 평가합니다. 각 case 절은 일치시킬 값의 패턴입니다. case에 대해 모든 종류의 패턴을 사용할 수 있습니다.
값이 case의 패턴과 일치하면 해당 case 절이 실행됩니다. 비어있지 않은 case 절은 완료 후 switch의 끝으로 이동합니다. Dart switch는 break 문이 필요하지 않습니다. 비어있지 않은 case 절을 종료하는 다른 방법은 continue, thorw 또는 return 문입니다.
일치하는 case 절이 없을 때 기본 또는 와일드카드 _ 절을 사용하여 코드를 실행합니다.
switch (command) {
case 'OPEN':
executeOpen();
continue newCase; // newCase 레이블로 이동하여 계속 실행
case 'DENIED': // case절이 비어있어서 'CLOSED' 절이 실행
case 'CLOSED':
executeClosed(); // 'DENIED' 또는 'CLOSED' 경우에 실행
newCase:
case 'PENDING':
executeNowClosed(); // 'OPEN'과 'PENDING'의 경우에 실행
}
4. switch식
switch식은 일치하는 케이스의 식 본문을 기반으로 값을 생성합니다. 식의 시작부분을 제외하고 Dart가 표현식을 허용하는 모든 위치에서 switch식을 사용할 수 있습니다.
var x = switch (y) { ... };
print(switch (x) { ... });
return switch (x) { ... };
예시로 다음과 같은 switch문을 switch식으로 변경할 수 있습니다.
switch (charCode) {
case slash || star || plus || minus: // Logical-or pattern
token = operator(charCode);
case comma || semicolon: // Logical-or pattern
token = punctuation(charCode);
case >= digit0 && <= digit9: // Relational and logical-and patterns
token = number();
default:
throw invalid();
}
↓
token = switch (charCode) {
slash || star || plus || minus => operator(charCode),
comma || semicolon => punctuation(charCode),
>= digit0 && <= digit9 => number(),
_ => throw invalid()
};
switch문의 구문과 switch식의 구문은 다릅니다. switch식의 차이로는
- case는 case 키워드로 시작하지 않습니다.
- case 본문은 일련의 명령문이 아닌 단일 표현ㅅ기입니다.
- 각 case에는 본문이 있어야 합니다. 빈 케이스에 대한 명시적 fallthrough는 없습니다.
- case 패턴은 : 대신 => 를 사용하여 본문에서 분리됩니다.
- case는 ,로 구분됩니다(및 선택적 후행 , 허용)
- 기본 case는 default와 _를 모두 허용하지 않고 _만 허용합니다.
5. 철저한 검사(Exhaustiveness checking)
Exhaustiveness checking는 값이 switch에 들어갈 수 있지만 어떤 경우에도 일치하지 않는 경우 컴파일 시간 오류를 보고하는 기능입니다.
bool? b = false;
// 컴파일 오류 발생
// Non-exhaustive switch on bool?, missing case to match null possiblity:
switch (b) {
case true: print('yes');
case false: print('no');
}
default case는 switch에 모든 가능한 값을 포함합니다. 이것은 모든 유형의 switch를 철저하게 만듭니다.
Enums 및 sealed 타입은 default case가 없더라도 가능한 값을 알고 완전히 열거할 수 있기 때문에 switch에 특히 유용합니다. 해당 클래스의 하위 유형을 전환할 때 완전성 검사를 활성화하려면 클래스에 sealed 수정자를 사용하세요.
sealed class Shape {
double calculateArea();
}
class Square extends Shape { ... }
class Circle extends Shape { ... }
// ...
double calculateArea(Shape shape) =>
switch (shape) {
Square(length: var l) => l * l,
Circle(radius: var r) => math.pi * r * r
};
5.Guard clause
case 절 뒤에 선택적 guard clause 설정하려면 when 키워드를 사용합니다. guard clause은 if case와 switch 문 및 식에 모두 사용할 수 있습니다.
switch (pair) {
case (int a, int b) when a > b:
print('First element greater');
case (int a, int b):
print('First element not greater');
}
gaurd clause은 일치 후 부울 식을 푱가합니다. 이렇게 하면 예시 본문을 실행해야하는 지 여부에 대한 제약 조건을 추가할 수 있습니다. gauard clause는 거짓으로 평가되면 전체 switch를 종료하지 않고 다음 case로 실행이 진행됩니다.
'Programming > Dart' 카테고리의 다른 글
Dart / Flutter 에러 핸들링 (1) | 2023.06.06 |
---|---|
Dart / Flutter 반복문 (Loops) (0) | 2023.06.03 |
Dart / Flutter 기본 문법 (타입) (0) | 2023.03.05 |
Dart / Flutter 기본 문법 (변수) (0) | 2023.03.01 |
Dart / Flutter 소개 (0) | 2023.03.01 |