Dart-02: Language Tour
Dart-02-01   Important concepts
Dart-02-02   Keywords
Dart-02-03   Variables
Dart-02-04   Built-in types
Dart-02-05   Functions
Dart-02-06   Operators
Dart-02-07   Control flow statements
Dart-02-08   Exceptions
Dart-02-09   Classes
Dart-02-10   Generics
Dart-02-11   Libraries and visibility
Dart-02-12   Asynchrony support
Dart-02-13   Generators
Dart-02-14   Callable classes
Dart-02-15   Isolates
Dart-02-16   Typedefs
Dart-02-17   Metadata
Dart-02-18   Comments

Control flow statements

Dart - Functions

다음 중 하나를 사용하여 Dart code의 flow를 제어할 수 있다.

  • if and else
  • for loops
  • while and do-while loops
  • break and continue
  • switch and case
  • assert

Exception chapter에서 설명된 대로, try-catchthrow를 사용하여 control flow에 영향을 줄 수도 있다.

0. Example

if (year >= 2001) {
  print('21st century');
} else if (year >= 1901) {
  print('20th century');
}

for (final object in flybyObjects) {
  print(object);
}

for (int month = 1; month <= 12; month++) {
  print(month);
}

while (year < 2016) {
  year += 1;
}>)

1. If and else

Dart는 다음 sample에서 볼 수 있듯이, 선택적 else문이 있는 if문을 지원한다.

if (isRaining()) {
  you.bringRainCoat();
} else if (isSnowing()) {
  you.wearJacket();
} else {
  car.putTopDown();
}

JavaScript와 달리, 조건은 무조건 boolean 값을 사용해야 한다.

2. For loops

표준 for loop로 iterate 할 수 있다. 예를 들어:

var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
  message.write('!');
}

Dart for loop 내부의 closure는 index의 값을 capture하여, JavaScript에서 발견되는 일반적인 함정을 방지한다. 예를 들어 다음을 고려한다:

var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());

예상대로 출력은 0 다음 1이다. 이와는 대조적으로, JavaScript에서는 2 다음 2를 출력한다.

반복하는 객체가 Iterable(List 또는 Set)이고 현재 iteration counter를 알 필요가 없는 경우, iteration 형식의 for-in을 사용할 수 있다.

for (final candidate in candidates) {
  candidate.interview();
}

반복 가능한 class에는 또 다른 option으로 forEach() method가 있다.

var collection = [1, 2, 3];
collection.forEach(print);

3. While and do-while

while loop는 loop를 시작하기 전에 조건을 평가한다.

while (!isDone()) {
  doSomething();
}

do-while loop는 loop 이후에 조건을 평가한다.

do {
  printLine();
} while (!atEndOfPage());

4. Break and continue

loop 중지에 break를 사용한다:

while (true) {
  if (shutDownRequested()) break;
  processIncomingRequests();
}

다음 loop iteration으로 건너뛸 때 continue를 사용한다:

for (int i = 0; i < candidates.length; i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperience < 5) {
    continue;
  }
  candidate.interview();
}

list와 set과 같은 Iterable을 사용한다면, 해당 예제를 다르게 작성할 수도 있다:

candidates
    .where((c) => c.yearsExperience >= 5)
    .forEach((c) => c.interview());

5. Switch and case

Dart의 switch 문은 ==을 사용하여 정수, 문자열, compile-time constant를 비교한다. 비교되는 객체는 모두 동일한 class의 instance여야 하며 (해당 subtype이 아님), class는 ==를 override 해서는 안 된다. Enumerated types는 switch문에서 잘 작동한다.

비어 있지 않은 case 절은 일반적으로 break문으로 끝난다. 비어 있지 않은 case 절을 끝내는 다른 유효한 방법은 continue, throw, return문이 있다.

어떤 case절과도 일치하지 않을 때, default절을 사용하여 code를 실행한다:

var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'PENDING':
    executePending();
    break;
  case 'APPROVED':
    executeApproved();
    break;
  case 'DENIED':
    executeDenied();
    break;
  case 'OPEN':
    executeOpen();
    berak;
  default:
    executeUnknown();
}

다음 예에서는 case 절에서 break문을 생략하여서 error가 발생한다:

var command = 'OPEN';
switch (command) {
  case 'OPEN':
    executeOpen();
    // ERROR: Missing break

  case 'CLOSED':
    executeClosed();
    break;
}

그러나 Dart는 다음과 같은 fall-through 형식을 허용하는 빈 case절을 지원한다.

var command = 'CLOSED';
switch (command) {
  case 'CLOSED': // Empty case falls through.
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNOWClosed();
    break;
}

fall-through를 원할 경우, continue문과 label을 사용할 수 있다.

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
  // Continues executing at the nowClosed label.

  nowClosed:
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowCLosed();
    break;
}

case절은 해당 절의 버위 내에서만 볼 수 있는 지역 변수가 있을 수 있다.

6. Assert

개발하는 동안, boolean 조건이 false인 경우 정상적인 실행을 방해하기 위해 assert(condition, ooptionalMessage)문을 사용한다. 이 tour 전체에서 assert문의 예를 찾을 수 있다. 몇 가지 예시가 더 있다:

// Make sure the variable has a non-null value.
assert(text != null);

// Make sure the value is less than 100.
assert(number < 100);

// Make sure this is an https URL.
assert(urlString.startsWith('https'));

assertion에 message를 붙이려면, assert의 두 번째 argument로 string을 추가한다. (optionally with a trailing comma)

assert(urlString.startsWith('https'),
    'URL ($urlString) should start with "https".');

assert의 첫 번째 argument는 boolean 값으로 해석되는 모든 expression이 될 수 있다. expression의 값이 true이면 assertion이 성공하고 실행이 계속된다. 만일 false이면 assertion이 실패하고 예외(AssertionError)가 발생한다.

assertion은 정확히 언제 작동하는가? 이는 사용 중인 tool과 framework에 따라 다르다.

  • Flutter는 debug mode에서 assertion을 활성화한다.
  • dartdevc와 같은 개발 전용 tool은 일반적으로 default로 assertion을 활성화한다.
  • dart run 및 dart2js와 같은 일부 tool은 command-line flag: --enable-asserts를 통해 assertion을 지원한다.

production code에서, assertion은 무시되고, assert에 대한 argument는 평가되지 않는다.

태그:

카테고리:

업데이트:

댓글남기기