Post

[Dart] 3. 흐름 제어문

※ https://dart-ko.dev/language, https://dart-ko.dev/language/loops, https://dart-ko.dev/language/branches, https://dart-ko.dev/language/error-handling#assert 을 참고하여 작성하였습니다.

Loops

  • For

    • 활용 1

      • StringBuffer 클래스: 문자열을 동적으로 추가, 수정할 수 있는 메서드 제공
      1
      2
      3
      4
      5
      
      var message = StringBuffer('Dart is fun');
      for (var i = 0; i < 5; i++) {
        message.write('!');
      }
      print(message); // Dart is fun!!!!!
      
    • 활용 2: () => print(i)를 클로저 함수로 활용

      1
      2
      3
      4
      5
      6
      7
      8
      
      var callbacks = [];
      for (var i = 0; i < 2; i++) {
        callbacks.add(() => print(i));
      }
          
      for (final c in callbacks) {
        c();
      }
      
    • 활용 3: 클래스의 인스턴스를 for문으로

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      
      class Candidate {
        final String name;
        final int yearsExperience;
          
        Candidate(this.name, this.yearsExperience);
      }
          
      void main() {
        var candidates = [
          Candidate('Alice', 5),
          Candidate('Bob', 3),
          Candidate('Charlie', 7),
        ];
        for (final Candidate(:name, :yearsExperience) in candidates) {
          print('$name has $yearsExperience of experience.');
        }
      }
      
    • 활용 4: forEach

      1
      2
      
      var collections= [1, 2, 3];
      colelction.forEach(print); // 1 2 3
      
  • While, do-while

  • break-continue

    • break: while에서 분기문을 exit하고 싶을 때
    • continue: for문에서 다음 분기문으로 pass하고 싶을 때
  • where(): 특정 조건을 만족하는 요소들만 선택적으로 추출

    1
    2
    3
    4
    5
    6
    7
    
    void main() {
      List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
      
      var evenNumbers = numbers.where((number) => number % 2 == 0);
      
      print(evenNumbers); // (2, 4, 6, 8, 10)
    }
    

Branching(분기)

  • switch-case

    • 활용 1: case에 연산자 사용 가능(<, >, ≤, ≥, , &&, …)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      
      var grade= 'C';
      switch(grade){
        case 'A' || 'B':
          print('best');
          break;
        case 'C' || 'D':
          print('good');
          break;
        case 'E' || 'F':
          print('bad');
          break;
        default:
          print('worst');
          break;
      }
      
    • 활용 2: 두 개의 값도 활용 가능

      1
      2
      3
      4
      5
      6
      7
      
      var pair= (1, 3);
      switch (pair) {
        case (int a, int b) when a > b:
          print('First element greater');
        case (int a, int b):
          print('First element not greater');
      }
      

Exceptions(에러 핸들링)

  • Explanation

    • Exception과 Error 타입 제공
      • Exception과 Error 객체 이외에도 non-null 객체를 예외로 발생시킬 수 있음
    • 원하는 예외 정의 가능
  • 예외

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    void misbehave() {
      try {
        dynamic foo = true;
        print(foo++); // 런타임 에러
      } catch (e) {
        print('misbehave() partially handled ${e.runtimeType}.');
        rethrow; // 호출자가 예외를 확인 할 수 있도록 허락
      }
    }
      
    void main() {
      try {
        misbehave();
      } catch (e) {
        print('main() finished handling ${e.runtimeType}.');
      }
    }
    
    • Throw: 예외를 throwing 또는 raising하는 코드
    • Catch: 예외 처리문
      • 예외가 발생한 타입에 따라 예외 처리를 진행할 수도 있고,
      • 별도로 예외 타입을 명시해주지 않으면 모든 타입의 예외를 처리할 수 있음
    • Finally: 예외 발생 여부와 상관 없이 실행하고 싶은 코드를 적는 곳
  • Assert

    • assert(~)
      • ~가 참이면 pass
      • ~가 거짓이면 error 메시지. 즉, 예외 처리
    • 예제
      • assert(text != null);
      • assert(5>3);
This post is licensed under CC BY 4.0 by the author.