edubun English

반복문: for와 while

1부터 100까지의 자연수를 손으로 더하면 한참 걸립니다. 세 줄짜리 for 반복문은 단숨에 5050을 출력합니다.

같은 일을 여러 번 하기

1부터 5까지는 console.log 다섯 줄로 출력해도 괜찮습니다. 1부터 1,000까지를 그렇게 쓸 수는 없습니다. 반복문은 같은 코드 묶음을 조금씩 바꿔 가며 계속 실행하다가, 조건이 멈추라고 하면 멈춥니다. 컴퓨터가 제값을 하는 곳이 바로 반복문입니다. 지루해하지도 않고 세다가 잊어버리지도 않습니다.

for 반복문

for (let i = 1; i <= 5; i++) {
  console.log(i);
}
// prints 1, 2, 3, 4, 5 on separate lines

for 뒤의 괄호에는 세미콜론으로 나눈 세 부분이 있습니다. 첫째 let i = 1은 반복이 시작되기 전에 한 번 실행되어 세는 변수를 만듭니다. 둘째 i <= 5는 조건으로, 매번 돌기 전에 확인하고 false가 되면 반복이 끝납니다. 셋째 i++는 한 바퀴가 끝날 때마다 실행되어 세는 값을 하나 늘립니다. 블록을 한 번 도는 것을 반복 한 회(iteration)라고 합니다. 따라가 보면, i가 1이고 조건이 true라 1을 출력하고, i가 2가 되고, 이렇게 계속하다가 i가 6이 되면 조건이 false라서 닫는 중괄호 다음으로 넘어갑니다.

세는 변수는 수학의 전통에 따라 보통 i라고 부르지만 어떤 이름이든 됩니다. 다른 간격으로 셀 수도 있습니다. for (let i = 10; i >= 0; i -= 2)는 10, 8, 6, 4, 2, 0으로 거꾸로 셉니다.

합계 쌓아 가기

가장 흔한 반복문 모양은 누적입니다. 반복 전에 변수를 하나 만들고, 반복 안에서 값을 고치고, 반복이 끝난 뒤에 씁니다. 리드에 나온 합계는 이렇게 구합니다.

let sum = 0;
for (let i = 1; i <= 100; i++) {
  sum += i;
}
console.log(sum);   // 5050

줄마다 놓인 자리를 보세요. let sum = 0이 반복 안에 있으면 매번 sum이 0으로 돌아갑니다. console.log가 반복 안에 있으면 답 하나 대신 중간 합계를 100번 출력합니다. 반복의 앞과 뒤도 반복 자체만큼 중요합니다.

while 반복문

while 반복문에는 조건만 있습니다. 조건이 true인 동안 블록을 계속 실행합니다. 1,000을 넘을 때까지 수를 두 배로 늘리는 것처럼, 몇 번 돌아야 할지 미리 모를 때 씁니다.

let n = 1;
let steps = 0;
while (n <= 1000) {
  n *= 2;
  steps++;
}
console.log(n, steps);   // 1024 10

while 반복문 안의 무언가가 언젠가는 조건을 false로 만들어야 합니다. n을 바꾸는 줄을 빠뜨리면 조건이 영원히 true로 남습니다. 이것이 무한 반복이고, 페이지가 멈춥니다. 실습 상자에서 그렇게 되면 페이지를 새로 고친 뒤 코드를 고치세요. for 반복문은 바꾸는 단계가 머리 부분에 적혀 있어서 이런 실수가 덜 납니다.

break와 continue

반복문 안의 흐름을 바꾸는 키워드가 둘 있습니다. break는 반복을 곧장 빠져나갑니다. continue는 이번 회의 나머지를 건너뛰고 다음 회로 넘어갑니다. 예를 들어 1부터 10까지 도는 반복의 맨 위에 if (i % 3 === 0) continue;를 넣으면 3, 6, 9만 빼고 출력합니다.

풀이 예시. 1부터 50까지 7의 배수는 몇 개일까요? let count = 0으로 시작해 i를 1부터 50까지 돌리고, 안에 if (i % 7 === 0) count++;를 씁니다. 반복이 끝나면 count는 7입니다. 7, 14, 21, 28, 35, 42, 49입니다.

for (시작; 조건; 바꾸기) { 본문 } for (let i = 1; i <= 5; i++)

반복문코드 묶음을 되풀이해 실행하는 코드
반복 한 회반복문 본문을 한 번 도는 것
세는 변수몇 번째인지 세는 변수. 흔히 i
누적 변수sum처럼 반복 안에서 쌓아 가는 변수
while조건이 true인 동안 되풀이
무한 반복조건이 끝내 false가 되지 않는 반복
break반복을 지금 빠져나감
continue다음 회로 건너뜀
  1. 몇 줄이 출력될까요?
    for (let i = 0; i < 4; i++) {
      console.log(i);
    }
  2. 마지막으로 출력되는 수는?
    for (let i = 0; i < 4; i++) {
      console.log(i);
    }
  3. 무엇이 출력될까요?
    let total = 0;
    for (let i = 1; i <= 4; i++) {
      total += i;
    }
    console.log(total);
  4. 무엇이 출력될까요?
    let p = 1;
    for (let i = 1; i <= 5; i++) {
      p *= 2;
    }
    console.log(p);
  5. 무엇이 출력될까요?
    let n = 10;
    while (n > 3) {
      n -= 3;
    }
    console.log(n);
  6. 몇 줄이 출력될까요?
    for (let i = 10; i >= 0; i -= 2) {
      console.log(i);
    }
  7. 무엇이 출력될까요?
    for (let i = 1; i <= 10; i++) {
      if (i === 4) break;
      console.log(i);
    }
    • 1 2 3 on separate lines
    • 1 to 10 except 4
    • 1 2 3 4 on separate lines
  8. 몇 줄이 출력될까요?
    for (let i = 1; i <= 10; i++) {
      if (i % 2 === 0) continue;
      console.log(i);
    }
  9. 이 반복문의 문제는?
    let i = 0;
    while (i < 5) {
      console.log(i);
    }
    • 문제없음
    • i가 바뀌지 않아 끝나지 않음
    • 아무것도 출력하지 않음
  10. 무엇이 출력될까요?
    let count = 0;
    for (let i = 1; i <= 50; i++) {
      if (i % 7 === 0) count++;
    }
    console.log(count);
핵심 정리
  • for (시작; 조건; 바꾸기) { ... }는 조건이 true인 동안 되풀이합니다.
  • 누적 변수는 반복 앞에서 만들고, 안에서 고치고, 뒤에서 씁니다.
  • while (조건) { ... }은 몇 번 돌지 모를 때 알맞습니다.
  • 무언가가 조건을 false로 만들어야 반복이 끝납니다.
  • break는 반복을 빠져나가고, continue는 다음 회로 넘어갑니다.