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 |