본문 바로가기
기타개발/Flutter

Dart #4 : if-else, for/while/do-while, switch, exceptions

by 궝테스트 2020. 8. 27.

Dart : https://dart.dev/guides/language/language-tour

 

1. If and else

  • if, else if 의 조건문은 boolean 값이어야 한다
if (isRaining()) {
  you.bringRainCoat();
} else if (isSnowing()) {
  you.wearJacket();
} else {
  car.putTopDown();
}

여기서 잠깐, Collection if

  • 조건으로 컬렉션의 값을 조정하고 싶을 때 아래처럼 사용한다
var nav = [
  'Home',
  'Furniture',
  'Plants',
  if (promoActive) 'Outlet'
];

 

2. For loops

var message = StringBuffer('Dart is fun');

// 기본적인 for loops
for (var i = 0; i < 5; i++) {
  message.write('!');
}

// canditates 가 Iterable 이면 forEach 를 사용할 수 있다
candidates.forEach((candidate) => candidate.interview());

// for-in 으로도 사용할 수 있다
var collection = [0, 1, 2];
for (var x in collection) {
  print(x); // 0 1 2
}

여기서 잠깐, Collection for

var listOfInts = [1, 2, 3];
var listOfStrings = [
  '#0',
  for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');

 

3. While and do-while

// loop 를 돌기 전에 조건문을 체크한다
while (!isDone()) {
  doSomething();
}

// loop 를 먼저 돌고 조건문을 체크한다
do {
  printLine();
} while (!atEndOfPage());

 

4. Break and continue

// break 를 만나면 loop 를 멈추고 빠져나간다
while (true) {
  if (shutDownRequested()) break;
  processIncomingRequests();
}

// continue 를 만나면 다음 iteration 으로 넘긴다
for (int i = 0; i < candidates.length; i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperience < 5) {
    continue;
  }
  candidate.interview();
}


// List 또는 Set 의 경우 where() 를 사용하여 forEach 를 실행할 수 있다
candidates
    .where((c) => c.yearsExperience >= 5)
    .forEach((c) => c.interview());

 

5. Switch and case

// 기본 break 가 들어간 switch-case 구문
var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'OPEN':
    executePending();
    // break 없으면 Error
  default:
    executeUnknown();
}

// break 없이 비어있는 switch-case 구문
var command = 'CLOSED';
switch (command) {
  case 'CLOSED': // 비어있는 경우 아래 case 의 excuteNowClosed() 를 실행한다
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

// continue 를 사용한 switch-case 구문
var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
  // nowClosed 라벨에서 계속 실행한다

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

 

6. Exceptions

  • Java와 달리 Dart 의 모든 예외는 확인되지 않은 예외이다
  • 메서드는 throw 할 수있는 예외를 선언하지 않으며 예외를 포착 할 필요가 없다

6-1. Throw

// 정의된 throws
throw FormatException('Expected at least 1 section');

// Custom throws
throw 'Out of llamas!';

// 표현식으로 throws
void distanceTo(Point other) => throw UnimplementedError();

 

6-2. Catch

  • 아래 예제와 예외를 잡는다면 OutOfLlamasException 에는 앱이 죽지 않는다
// 하나의 예외를 처리 할 경우
try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}


/// 둘 이상의 예외 처리 할 경우 여러 catch 절을 지정할 수 있다
/// catch 절에 타입을 지정하지 않으면 모든 타입의 throw 된 객체를 처리 할 수 있다
try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // A specific exception
  buyMoreLlamas();
} on Exception catch (e) {
  // Anything else that is an exception
  print('Unknown exception: $e');
} catch (e) {
  // No specified type, handles all
  print('Something really unknown: $e');
}
  • catch() 에 하나 또는 두 개의 매개 변수를 지정할 수 있다
  • 첫 번째는 throw 된 예외이고 두 번째는 스택 추적 (StackTrace 객체) 이다.
try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
}
  • 예외를 부분적으로 처리하고 전파를 허용하려면 rethrow 키워드를 사용한다
void misbehave() {
  try {
    dynamic foo = true;
    print(foo++); // Runtime error
  } catch (e) {
    print('misbehave() partially handled ${e.runtimeType}.');
    rethrow; // 해당 함수를 호출한 곳에서 exception 을 볼 수 있다
  }
}

void main() {
  try {
    misbehave();
  } catch (e) {
    print('main() finished handling ${e.runtimeType}.');
  }
}

 

6-3. Finally

  • 예외 발생 여부에 관계없이 일부 코드가 실행되도록하려면 finally 절을 사용한다
  • finally 절은 일치하는 catch 절 이후에 실행된다
  • 예외와 일치하는 catch 절이 없으면 finally 절이 실행 된 후 예외가 전파된다
try {
  breedMoreLlamas();
} finally {
  // Always clean up, even if an exception is thrown.
  cleanLlamaStalls();
}

try {
  breedMoreLlamas();
} catch (e) {
  print('Error: $e'); // Handle the exception first.
} finally {
  cleanLlamaStalls(); // Then clean up.
}

 

'기타개발 > Flutter' 카테고리의 다른 글

Dart #6 : Abstract, Implicit interface, Extends  (0) 2020.08.28
Dart #5 : Classes, Constructor  (0) 2020.08.28
Dart #3 : Operators  (0) 2020.08.27
Dart #2 : Functions  (1) 2020.08.27
Dart #1 : Type, Collections, Final, Const etc.  (0) 2020.08.26

댓글