본문 바로가기

Programming/Dart

Dart / Flutter 조건문 (Branches/분기)

반응형

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로 실행이 진행됩니다.

 

출처: https://dart-ko.dev/language/branches

반응형

'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