반복문 Loops

1. 표준 for 반복문

문법:for(초기화; 조건; 반복처리) { 반복문 본체 }

1:기본 문자열 연결

void main() {
  var message = StringBuffer('welcome to FoxDevelop.com');
  for (var i = 0; i < 5; i++) {
    message.write('!');
  }
  print(message); // welcome to FoxDevelop.com!!!!!
}Code language: Dart (dart)

0부터 5까지 반복(5는 미포함)이므로 i 값은 0~4까지 총 5회 실행합니다. 매번 문자열 끝에 느낌표를 붙입니다.

1회차 welcome to FoxDevelop.com!

2회차 welcome to FoxDevelop.com!!

5회차 welcome to FoxDevelop.com!!!!!

특징:클로저가 독립적인 인덱스 바인딩 (JS와의 큰 차이점)

Dart는 반복마다 독립적인 i 변수를 할당하기 때문에 JavaScript처럼 모두 2만 출력하는 오류가 발생하지 않습니다.

void main() {
  var callbacks = [];
  for (var i = 0; i < 2; i++) {
    callbacks.add(() => print(i));
  }
  for (final c in callbacks) {
    c();
  }
}
// 출력
// 0
// 1
Code language: Dart (dart)

2. for-in 반복 가능 객체 List/Set 순회

인덱스가 필요 없고 값만 꺼내 쓸 때 적합합니다.

기본 사용법

class Candidate {
  void interview() => print("면접 완료");
}

void main() {
  var candidates = [Candidate(), Candidate()];
  for (var candidate in candidates) {
    candidate.interview();
  }
}Code language: Dart (dart)

candidates 리스트를 순회하며 요소를 candidate 변수에 담고 interview 메서드를 호출합니다. 한 요소 처리 후 자동으로 다음 요소로 이동합니다.

고급 활용

for-in과 객체 패턴 분해 (Dart3 이상)

class Candidate {
  final String name;
  final int yearsExperience;
  Candidate({required this.name, required this.yearsExperience});
}

void main() {
  var candidates = [
    Candidate(name: "Lily", yearsExperience: 6),
    Candidate(name: "Tom", yearsExperience: 3),
  ];

  // 객체 패턴으로 필드 직접 분해
  for (final Candidate(:name, :yearsExperience) in candidates) {
    print('$name 은 경력 $yearsExperience 년');
  }
}
Code language: Dart (dart)

위 패턴 분해 기능과 결합해 객체 속성을 자동으로 name, yearsExperience 변수에 추출한 뒤 반복문 내에서 사용할 수 있습니다.

3. Iterable.forEach () 순회 메서드

컬렉션 기본 제공 함수형 순회로, 콜백 함수를 전달해 각 요소를 처리합니다.

void main() {
  var collection = [1, 2, 3];
  collection.forEach(print);
  // 출력 1 2 3
}Code language: Dart (dart)

forEach는 Dart 기본 내장 메서드로 모든 반복 가능 컬렉션에서 호출할 수 있습니다.

4. while /do-while

1. while

조건을 먼저 검사한 뒤 본문을 실행하므로 한 번도 실행되지 않을 수 있습니다. C/C++/Java/C# 등 다른 언어와 로직이 동일합니다.

bool isDone() => false;
void doSomething() => print("작업 실행");

void main() {
  while (!isDone()) {
    doSomething();
    break;
  }
}Code language: Dart (dart)

!isDone()을 평가하면 원본 반환값이 false이므로 반전되어 true가 되어 블록 내 코드가 실행됩니다.

doSomething();
break;

break를 만나면 반복문 전체가 종료되고 while 블록 뒤로 점프합니다. 만약 isDone()이 true를 반환한다면 첫 조건 검사에서 실패해 본문 코드가 전혀 실행되지 않습니다.

2. do-while

본문을 무조건 한 번 실행한 후 조건을 검사하기 때문에 최소 한 번은 동작합니다.

bool atEndOfPage() => true;
void printLine() => print("한 줄 출력");

void main() {
  do {
    printLine();
  } while (!atEndOfPage());
}
Code language: Dart (dart)

뒤쪽 while 조건이 true든 false든 do {} 중괄호 안 코드는 무조건 한 번 실행됩니다.

5. break /continue

break

반복문 전체를 즉시 종료하고 반복문 뒤 코드로 이동하며, 남은 코드는 실행하지 않습니다.

bool shutDownRequested() => true;
void processIncomingRequests() => print("요청 처리");

void main() {
  while (true) {
    if (shutDownRequested()) break;
    processIncomingRequests();
  }
  print("반복문 종료");
}
Code language: Dart (dart)

continue

현재 차례의 남은 코드를 건너뛰고 바로다음 반복으로 진입합니다.

기존 for 문 예시
class Candidate {
  final int yearsExperience;
  Candidate(this.yearsExperience);
  void interview() => print("면접 진행");
}

void main() {
  var candidates = [Candidate(3), Candidate(6)];
  for (int i = 0; i < candidates.length; i++) {
    var candidate = candidates[i];
    if (candidate.yearsExperience < 5) {
      continue; // 경력 5년 미만이면 면접 건너뜀
    }
    candidate.interview();
  }
}
Code language: Dart (dart)
함수형 대체 방식 (continue 불필요)
void main() {
  var candidates = [Candidate(3), Candidate(6)];
  candidates
      .where((c) => c.yearsExperience >= 5)
      .forEach((c) => c.interview());
}
Code language: Dart (dart)

6. 레이블 Label 다중 반복문 제어

문법:레이블명: 을 반복문 앞에 작성한 뒤 break 레이블 / continue 레이블 과 함께 사용

용도:중첩 반복문일 때 내부만이 아닌 외부 반복문을 직접 탈출/건너뛸 수 있음

1. break + label

2중 반복문 한 번에 탈출

void main() {
  outerLoop:
  for (var i = 1; i <= 3; i++) {
    for (var j = 1; j <= 3; j++) {
      print('i = $i, j = $j');
      if (i == 2 && j == 2) {
        break outerLoop; // outerLoop 라벨의 외부 반복문 즉시 종료
      }
    }
  }
  print('outerLoop exited');
}
Code language: Dart (dart)

출력:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Code language: Dart (dart)

2. continue + label

외부 반복문의 다음 차례로 바로 이동

void main() {
  outerLoop:
  for (var i = 1; i <= 3; i++) {
    for (var j = 1; j <= 3; j++) {
      if (i == 2 && j == 2) {
        continue outerLoop; // i=2의 남은 j 전부 건너뛰고 i=3으로 이동
      }
      print('i = $i, j = $j');
    }
  }
}
Code language: Dart (dart)

출력:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3

while+break+label 예시

void main() {
  var i = 1;
  outerLoop:
  while (i <= 3) {
    var j = 1;
    while (j <= 3) {
      print('i = $i, j = $j');
      if (i == 2 && j == 2) {
        break outerLoop;
      }
      j++;
    }
    i++;
  }
  print('outerLoop exited');
}
Code language: PHP (php)

실행 결과

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited

다른 프로그래밍 언어의 goto와 유사한 동작 방식입니다.

반복문 Loops

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다