자바스크립트 교재 · 7편 / 26편

반복문 — for·while·for of·for in

반복 4가지와 break/continue. for...of vs for...in 함정.

기초읽는 시간 6분2026-05-17
여러 종류의 JS 반복문 시작·종료 흐름이 그림으로 정리된 일러스트

같은 일을 여러 번 — JS 가 그걸 표현하는 도구는 4가지입니다. for, while, do…while, 그리고 ES6 의 for…of·for…in. 9편(배열) 의 map/filter/forEach 도 사실은 "함수형 반복" 이지만, 7편은 기본 4가지를 정리합니다.

고전 for — 횟수가 명확할 때

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

// 거꾸로
for (let i = 9; i >= 0; i--) { ... }

// 두 칸씩
for (let i = 0; i < 100; i += 2) { ... }

// 변수 두 개
for (let i = 0, j = 10; i < j; i++, j--) { ... }

let 가 아니라 var 면 함정. for (var i ...) 는 i 가 함수 스코프라서 클로저 안에서 의도와 다르게 동작합니다. 3편의 권장대로 항상 let 을 쓰세요.

while · do…while — 조건이 핵심일 때

// while — 조건을 먼저 확인
let count = 0;
while (count < 3) {
  console.log(count);
  count++;
}

// do…while — 최소 1번 실행 후 조건 확인
let answer;
do {
  answer = prompt("y/n?");
} while (answer !== "y" && answer !== "n");

do…while 은 "최소 한 번은 실행, 그 다음 조건 확인" — 입력 받기 같은 패턴에 자연스럽습니다. 그 외에는 while 또는 for 가 더 흔합니다.

for…of — 값을 순회 (배열·문자열 등 iterable)

const fruits = ["apple", "banana", "cherry"];

for (const fruit of fruits) {
  console.log(fruit);   // "apple", "banana", "cherry"
}

// 문자열도 iterable
for (const ch of "안녕") {
  console.log(ch);      // "안", "녕"
}

// Map·Set 도 가능
const set = new Set([1, 2, 3]);
for (const v of set) { ... }

// 인덱스가 필요하면 entries()
for (const [i, fruit] of fruits.entries()) {
  console.log(i, fruit);   // 0 apple, 1 banana, ...
}

입문 단계에서 가장 자주 쓰게 될 반복문입니다. const 로 받아도 매 반복마다 새 변수라서 안전.

for…in — 키(속성 이름) 를 순회 (객체용)

const user = { name: "준성", age: 39, role: "admin" };

for (const key in user) {
  console.log(key, user[key]);
  // "name" "준성"
  // "age" 39
  // "role" "admin"
}

for…in 의 함정. ① 순회 순서가 항상 보장되지는 않습니다(숫자 키 먼저 등). ② 배열에 쓰면 안 됨 — 프로토타입 체인의 속성까지 따라오고, 인덱스가 문자열로 옴. 배열은 항상 for…offorEach. ③ 객체 자기 속성만 보려면 Object.keys() + for…of 가 더 안전.

for of vs for in — 한 표로

for…offor…in
대상iterable(배열·문자열·Map·Set)객체의 enumerable 키
반환값(value)키(key, 문자열)
배열에권장금지
객체에바로 안 됨 (Object.entries 필요)가능하지만 Object.keys 권장
순서 보장예 (iterable 순서)아니오 (대체로 삽입 순)

break · continue — 흐름 제어

// break — 반복 즉시 종료
for (let i = 0; i < 100; i++) {
  if (i === 5) break;
  console.log(i);   // 0,1,2,3,4
}

// continue — 다음 반복으로 (현재 반복의 나머지 skip)
for (let i = 0; i < 5; i++) {
  if (i % 2 === 0) continue;
  console.log(i);   // 1,3
}

// 중첩 반복문에서 라벨 (드물게)
outer: for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 3; j++) {
    if (i === 1 && j === 1) break outer;
  }
}

함수형 대안 — map·filter·forEach (9편 예고)

// 명령형 for (배열을 두 배로)
const doubled = [];
for (const n of nums) doubled.push(n * 2);

// 함수형 map (같은 결과, 더 깔끔)
const doubled = nums.map(n => n * 2);

// 명령형 (짝수만)
const evens = [];
for (const n of nums) if (n % 2 === 0) evens.push(n);

// 함수형 filter
const evens = nums.filter(n => n % 2 === 0);

실전 선택. ① 새 배열 만들기 → map/filter (선언적, 의도 명확). ② 합·평균·최댓값 → reduce. ③ 단순 출력/사이드 이펙트 → forEach 또는 for…of. ④ 중간에 멈춰야 함 → for…of + break (forEach 는 break 못함). 9편에서 깊게.

8편 — 함수 선언·표현식·화살표

function·() => 의 모든 변형, this 의 차이는 22편에서.

📚 쉽게 배우는 자바스크립트 교재
이전: 6편 조건문 · 현재: 7편 (기초) · 다음 → 8편 함수 · 진행: 7/26

© 2026 주나이테크(주) @JUNAITECH