개발 시 특정 동작을 여러 번 반복해야 하는 경우에 사용하는 구문
while (condition) {
// 코드
// '반복문 본문(body)'이라 불림
}
조건(condition)이 truthy(참 같은 값, 불린 형태를 기대하는 문맥에서 true로 평가되는 값)인 경우에 실행되며 falsy인 경우 실행하지 않는다.
본문이 한 번 실행되는 것을 반복(iteration)이라고 한다.
조건을 설정하고, 조건에 포함되는 인수를 조작하여 원하는 반복을 얻는 방식으로 사용된다.
let i = 0;
while (i < 3) { // 0, 1, 2가 출력됩니다.
alert( i );
i++;
}
본문이 한 줄이면 중괄호를 쓰지 않아도 된다.
let i = 3;
while (i) alert(i--);
while문의 조건을 본문 아래로 옮겨 사용하는 방식.
do {
// 반복문 본문
} while (condition);
//예시
let i = 0;
do {
alert( i );
i++;
} while (i < 3);
조건과 별개로 최소 한 번은 실행하고자 할 때 사용한다.
대부분의 상황에서는 while문보다 사용도가 떨어진다.
while 반복문보다는 복잡하지만 가장 많이 쓰이는 형태의 반복문
for (begin; condition; step) {
// ... 반복문 본문 ...
}
1) begin 실행
2) condition 확인
3) condition이 truthy일 경우 본문 실행, falsy일 경우 반복문 중단(건너뛰는 것이 아닌 종료)
4) step 실행
두 번째 반복부터는 begin을 실행하지 않고 조건 확인부터 step까지만 실행됨.
//예시
for (let i = 0; i < 3; i++) { // 0, 1, 2가 출력됩니다.
alert(i);
}
//위 예시의 실행 순서
let i = 0;
if(i < 3) alert(i++) // i가 0이었고, alert출력 이후 1
if(i < 3) alert(i++) // i가 1이었고, alert출력 이후 2
if(i < 3) alert(i++) // i가 2이었고, alert출력 이후 3
if(i < 3) alert(i++) // i가 3이므로 break
위 예시의 경우 변수 i를 for문 안에서 선언했다. 이를 인라인 변수 선언이라고 부르며 반복문 안에서만 접근 가능하다.
for문 구성요소는 생략가능하다.
let i = 0; // i를 선언하고 값도 할당
for (; i < 3; i++) { // 'begin'이 필요하지 않기 때문에 생략
alert( i ); // 0, 1, 2
}
let j = 0;
for (; j < 3;) { // 'begin'과 'step'을 생략
alert( i++ );
}
for (;;) { // 'begin', 'condition', 'step'을 생략
// 끊임 없이 본문이 실행됩니다.
}
생략 시 주의사항이 있다. for문은 항상 두 개의 세미콜론(;)을 가진다는 것.
조건이 falsy가 아니더라도 본문에서 break 지시자를 사용하면 반복문을 종료할 수 있다.
continue 지시자는 반복문을 종료하지 않지만 현재 반복을 멈추고 다음 반복을 실행한다.
for (let i = 0; ; i++) { //조건 생략하여 무한 반복의 가능성이 있음
if (i >= 10) break; // 조건이 생략되어도 break를 통해 반복문 종료
if (i % 2 == 0) continue;// 조건이 참이라면 남아있는 본문은 실행되지 않음
alert(i); // 1, 3, 5, 7, 9가 차례대로 출력됨
}
break, continue 지시자는 문법적으로 ? 뒤에 사용할 수 없다. 따라서 삼항연산자에 사용될 수 없다. 주의!
여러 개의 중첩 반복문에서 break, continue 사용 시 대상 반복문을 지정할 수 있다.
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let input = prompt(`(${i},${j})의 값`, '');
// 여기서 멈춰서 아래쪽의 `완료!`가 출력되게 하려면 어떻게 해야 할까?
}
}
alert('완료!');
위의 경우 사용자가 cancel 버튼을 눌렀을 때 두 개의 반복문 모두 빠져나와야 하지만 break 사용만으로는 하위 for문만 종료시킬 수 있다. 이 때 레이블을 사용하면 상위 for문을 지정하고 종료할 수 있다.
레이블(label)은 반복문 앞에 콜론과 함께 쓰이는 식별자이다.
다음과 같이 사용할 수 있다.
labelName: for (...) {
...
}
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let input = prompt(`(${i},${j})의 값`, '');
// 사용자가 아무것도 입력하지 않거나 Cancel 버튼을 누르면 두 반복문 모두를 종료
if (!input) break outer; // (*)
// 입력받은 값을 가지고 무언가를 함
}
}
alert('완료!');
continue와 레이블을 사용하면 지정한 반복문의 현재 반복을 종료하고 다음 반복을 실행할 수 있다.
레이블 사용시 주의사항은 레이블 지정이 break, continue보다 위에서 작성되어야 적용가능하다는 점이다.
//불가능 예시
break label; // 아래 for 문으로 점프할 수 없습니다.
label: for (...)