I. for문 사용법
👉 MDN 문서 보기
괄호 안의 3개의 식에 따른 반복수행
- 변수의 선언 및 할당
- 종료조건. 부재 시 항상 참
- 참일 시 블록 안의 코드 이후 실행문
// 💡 변수이므로 let이 사용됨
for (let i = 0; i < 5; i++) {
console.log(i);
}
for (let i = 0; i < 5;) {
console.log(i++); // ++i로 바꿔볼 것
}
for (let i = 10; i >= 0; i-= 2) {
console.log(i);
}
💡 중첩 사용
for (let i = 1; i <= 9; i++) {
for (let j = 1; j <= 9; j++) {
console.log(`${i} * ${j} = ${i * j}`);
}
}
둘 이상의 변수 사용
for (let x = 0, y = 10; x <= y; x++, y--) {
console.log(x, y);
}
for (
let x = true, y = 0, z = 0;
y * z < 10;
x = !x, x ? y++ : z++
) {
console.log(y, z);
}
⭐ 무한루프 실행시 브라우저가 멈출 수 있음
let x = 0;
for (;;) {
console.log(x);
}
console.log('출력 안됨');
for (let i = 0; i < 10; i++) {
console.log(i--);
}
console.log('출력 안됨');
💡 객체와 배열의 for문
객체: for (키 이름 in 객체명) - 객체의 키들을 순서대로 반환
👉 MDN 문서 보기
const lunch = {
name: '라면',
taste: '매운맛',
kilocalories: 500,
cold: false
}
for (const key in lunch) { // 💡 변할 것이 아니므로 const 사용
console.log(key, ':', lunch[key])
}
// 키의 이름은 자유롭게 사용 가능
for (const k in lunch) {
console.log(k, ':', lunch[k])
}
배열: for (항목 of 배열명) - 배열의 항목들을 순서대로 반환
👉 MDN 문서 보기
- 정확히는 이터러블 iterable (배열도 그 일종)에 사용됨 이후 배울 것
const list = [1, '가나다', false, null];
for (const item of list) {
console.log(item);
}
for (const el of list) {
console.log(el);
}
// 문자열 역시 이터러블이므로 사용 가능
for (const letter of '안녕하세요~') {
console.log(letter);
}
💡 for ... of문의 장점
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// ⚠️ 변수(i)를 사용하므로 위험요소 존재
for (let i = 0; i < numbers.length; i++) {
// 이곳에 i를 변경하는 코드가 들어간다면...
console.log(numbers[i]);
}
// ⭐️ 변수를 사용하지 않음으로 보다 안전
for (const num of numbers) {
console.log(num);
}
💡 또 다른 예시
const numbers1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const numbers2 = [];
for (let num of numbers1) {
num++; // ⚠️ 복사된 값. let 사용 주목
numbers2.push(num + 1);
}
console.log(numbers1, numbers2);
for (let i = 0; i < numbers1.length; i++) {
numbers1[i]++; // ⚠️ 실제 값에 인덱스로 접근 - 원본 배열의 내용 변경
}
console.log(numbers1, numbers2);
II. continue와 break
1. continue - 한 루프를 건너뜀
👉 MDN 문서 보기
for (let i = 1; i <= 10; i++) {
if (i % 3 === 0) continue;
console.log(i);
}
console.log('for 루프 종료');
2. break - 블록을 종료하고 빠져나옴
👉 MDN 문서 보기
for (let i = 1; i <= 10; i++) {
if (i === 5) break;
console.log(i);
}
console.log('for 루프 종료');
3. label - 중첩된 반복문을 명명하여 continue 또는 break에 사용
👉 MDN 문서 보기
outer:
for (let i = 1; i < 10; i++) {
inner:
for (let j = 1; j < 10; j++) {
if (j % 2 === 0) continue inner;
if (i * j >= 30) continue outer;
if (j > 8) break inner;
if (i - j > 7) break outer;
console.log(i, j, i * j);
}
}
while - 조건이 참인 동안 반복수행
👉 MDN 문서 보기
let x = 0;
while (x < 10) {
console.log(x++);
}
💡 무한루프
let x = 0;
while (x < 10) {
console.log(x);
}
// 인위적인 무한반복에 널리 쓰이는 코드
while (true) {
console.log('무한반복');
}
⭐ break문으로 무한반복 탈출 가능
let x = 0;
while (true) {
if (x++ >= 5) break; // 😎
console.log(x);
}
// 1 ~ 5 출력
continue와 break 사용
// 1, 3, 5, 7을 의도한 코드. 그러나...
// ⚠️ 무한루프! 왜일까요?
let x = 0;
while (x < 14) {
if (x % 2 === 0) continue;
if (x > 7) break;
console.log(x++);
}
// 짧게 짠 수정 코드
let x = 0;
while (x < 14) {
if (x++ % 2 === 0) continue;
if (x > 8) break;
console.log(x - 1);
}
// 가독성 위주로 짠 코드
// 코드에 의도가 드러나도록
let x = 0;
while (x < 14) {
const toContinue = x % 2 === 0;
const toBreak = x > 7;
const xNow = x++;
if (toContinue) continue;
if (toBreak) break;
console.log(xNow);
}
더 짧고도 직관성을 유지한 코드의 예
let x = 0;
while (x < 14) {
const xNow = x++;
if (xNow % 2 === 0) continue;
if (xNow > 7) break;
console.log(xNow);
}
do while - 일단 수행하고 조건을 평가
👉 MDN 문서 보기
let x = 12;
do {
console.log(x++);
} while (x < 10);