반복문 — for·while·for of·for in
반복 4가지와 break/continue. for...of vs for...in 함정.
같은 일을 여러 번 — 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…of 나 forEach. ③ 객체 자기 속성만 보려면 Object.keys() + for…of 가 더 안전.
for of vs for in — 한 표로
| for…of | for…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