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