반응형

Dart, 흐름 제어  if, for, while, do while, switch

 

글. 수알치 오상문

 

다트에서 지원하는 흐름 제어 문법은 다음과 같습니다. 

  • if ~ else 조건문
  • for 반복문
  • while 그리고 do ~ while 반복문
  • break continue 
  • switch case 다중 분기문
  • assert  검사문

또한 try ~ catch throw를 이용한 예외처리도 가능합니다. (참고: Exceptions)

 

if ~ else 조건문

 

if 조건문은 else 문을 가질 수 있습니다. 

 

if (isRaining()) {  // 조건이 참이면 이 블록을 실행하고 아니면 넘어감

  you.bringRainCoat();

} else if (isSnowing()) {

  you.wearJacket();

} else {

  car.putTopDown();

}

 

자바스크립트와 다르게, 조건식은 논리형 값(boolean values)이어야 합니다. 참조: Booleans

 

for 반복문

 

다트는 전통적인 for 반복문도 지원합니다.  

 

var msg = 'Dart is fun';

for (var i = 0; i < 3; i++) {

  print(msg + "!!!");

}

 

[실행 결과]

Dart is fun!!!

Dart is fun!!!

Dart is fun!!!

 

다트는 forEach() 기능도 제공합니다. 리스트 같은 클래스는 forEach() 메서드가 있으며, 괄호에는 각 요소들을 하나씩 가져와서 수행할 함수를 지시합니다.

 

var callbacks = [];

 

for (var i = 0; i < 2; i++) {     // callbacks에는 함수 객체가 두개 추가된다.

  callbacks.add(() => print(i));  // 처음은 0을 출력하는 함수, 다음은 1을 출력하는 함수이다.

}                                     

 

callbacks.forEach((c) => c());  // callbacks에 있는 함수를 하나씩 실행한다.

 

[실행결과]

0

1

 

var collection = [1, 2, 3];

collection.forEach(print); 

 

[실행결과]

1

2

3

 

다트는 for( ~ in ~) 형식의 반복문을 지원합니다. 

 

for (var candidate in candidates) {

  candidate.interview();

}

 

while 및 do-while 반복문 

 

while 반복문은 조건식에 의해 반복 여부를 결정합니다.

 

while (!isDone()) {

  doSomething();

}

 

do ~ while 반복문도 조건식에 의해 반복 여부를 결정하지만 일단 한번은 몸통 코드를 실행한다는 점이 while 반복문과 다릅니다.l

do {

  printLine();

} while (!atEndOfPage());

 

break and continue 문장

 

반복문을 중간에 벗어나고 싶으면 break 문장을 사용합니다.

 

while (true) {

  if (shutDownRequested())

    break;

  processIncomingRequests();

}

 

반복문 몸통에서 아래 부분을 수행하지 않고 다음 반복으로 넘어가려면 continue 문장을 사용합니다.

 

for (int i = 0; i < candidates.length; i++) {

  var candidate = candidates[i];

  if (candidate.yearsExperience < 5) {

    continue;

  }

  candidate.interview();

}

 

참고로, 앞 예제는 다음처럼 작성할 수도 있습니다.

 

where((c) => c.yearsExperience >= 5)

forEach((c) => c.interview());

 

switch ~ case 다중 분기문 

 

switch 문장의 조건에는 정수, 문자열 및 컴파일 시간에 상수값을 가질 수 있는 값을 사용할 수 있습니다. 비교 대상은 같은 클래스의 실체이어야 합니다(하위 형은 아님). 열거형은 잘 동작합니다(Enumerated types). 클래스는 == 기능을 재정의하면 안됩니다.

 

각 case 영역은 일반적으로 break 문으로 끝납니다. 비어 있지 않은 case 절을 ​​종료하는 다른 유효한 방법은 continue, throw 또는 return 문이 있습니다.

 

var command = 'OPEN';

switch (command) {

  case 'CLOSED':

    executeClosed();

    break;

  case 'PENDING':

    executePending();

    break;

  case 'APPROVED':

    executeApproved();

    break;

  case 'DENIED':

    executeDenied();

    break;

  case 'OPEN':

    executeOpen();

    break;

  default:

    executeUnknown();

}

 

다음 예에서는 case 영역에서 break 문을 생략하여 오류를 만드는 경우입니다.

 

var command = 'OPEN';

switch (command) {

  case 'OPEN': executeOpen(); // ERROR: Missing break

  case 'CLOSED': executeClosed(); break;

}

 

Dart는 빈 case 영역도 가능하므로 다음과 같은 형식도 허용합니다.

 

var command = 'CLOSED';

switch (command) {

  case 'CLOSED':         // break; 생략하면 아래로 통과.

  case 'NOW_CLOSED': // CLOSED, NOW_CLOSED 경우가 여기서 처리되는 문제 발생

    executeNowClosed();

    break;

}

 

switch 문에서 continue 문과 레이블을 사용할 수 있습니다.

 

var command = 'CLOSED';

switch (command) {

  case 'CLOSED':

    executeClosed();

    continue nowClosed; // nowClosed 레이블로 이동.

  case 'OPEND':

    executeOpend();

    break;

  nowClosed:  //  <-------------

  case 'NOW_CLOSED': // CLOSED, NOW_CLOSED는 여기서 처리 

    executeNowClosed();

    break;

}

 

case 영역은 그 영역의 지역 변수를 가질 수 있으며 해당 case 영역에서만 사용 가능합니다.

 

<이상>

반응형

'Dart' 카테고리의 다른 글

Dart, 예외 처리 try ~ catch  (0) 2021.06.15
Dart, 디버깅 함수 assert()  (0) 2021.06.15
Dart, 연산자  (0) 2021.06.15
Dart, 함수 비교 테스트  (0) 2021.06.15
Dart, 접근 범위와 클로저(closure)  (0) 2021.06.15

+ Recent posts