조건문과 반복문 if/switch부터 for…in, for…of까지
조건문 (if…else, switch)
if…else
조건에 따라 다른 코드를 실행할 때 사용하는 가장 기본적인 문법이다.
const score = 85;
if (score >= 90) {
console.log("A등급");
} else if (score >= 80) {
console.log("B등급");
} else if (score >= 70) {
console.log("C등급");
} else {
console.log("F등급");
}
// B등급- 조건은 위에서부터 순서대로 평가되고, 처음으로 참(truthy)이 되는 블록만 실행된다.
- 조건식 안에서는 값이 boolean이 아니어도 truthy/falsy로 자동 변환되어 평가된다.
const name = "";
if (name) {
console.log(`안녕하세요, ${name}님`);
} else {
console.log("이름을 입력해주세요");
}
// 이름을 입력해주세요 ("" 는 falsy이기 때문)삼항 연산자
간단한 조건은 if...else 대신 삼항 연산자로 한 줄에 처리할 수 있다.
const age = 20;
const message = age >= 19 ? "성인입니다" : "미성년자입니다";
console.log(message); // 성인입니다조건이 복잡하거나 분기가 3개 이상이면 삼항 연산자를 중첩해서 쓰기보다는 if...else나 switch를 쓰는 게 가독성 면에서 낫다.
switch
하나의 값을 여러 경우와 비교해서 분기할 때 사용한다. 조건이 많고 각 조건이 특정 값과의 “일치 여부”를 비교하는 경우 if...else보다 깔끔하다.
const day = "수";
switch (day) {
case "월":
case "화":
case "수":
case "목":
case "금":
console.log("평일입니다");
break;
case "토":
case "일":
console.log("주말입니다");
break;
default:
console.log("잘못된 입력입니다");
}
// 평일입니다- 각
case뒤에break를 빼먹으면, 다음case로 실행이 그대로 이어지는 폴스루(fall-through) 현상이 발생한다. 위 예시처럼 여러 case를 묶어서 같은 동작을 시키고 싶을 때는 일부러 이 특성을 활용하기도 한다. switch는 값 비교 시===(일치 비교)를 사용한다. 즉 타입까지 같아야 매칭된다.
반복문 (for, while, for…in, for…of)
for
반복 횟수가 정해져 있을 때 가장 많이 쓰는 반복문이다.
for (let i = 0; i < 5; i++) {
console.log(i);
}
// 0 1 2 3 4초기식; 조건식; 증감식세 부분으로 구성된다.break로 반복을 즉시 종료하거나,continue로 현재 회차만 건너뛸 수 있다.
for (let i = 0; i < 10; i++) {
if (i === 3) continue; // 3만 건너뜀
if (i === 6) break; // 6에서 반복 종료
console.log(i);
}
// 0 1 2 4 5while
조건이 참인 동안 계속 반복한다. 반복 횟수가 정해져 있지 않고, 특정 조건이 만족될 때까지 반복해야 할 때 적합하다.
let count = 0;
while (count < 3) {
console.log(count);
count++;
}
// 0 1 2do…while
조건 확인 전에 코드 블록을 최소 한 번은 무조건 실행한다는 점이 while과 다르다.
let num = 10;
do {
console.log(num); // 조건이 false여도 한 번은 실행됨
num++;
} while (num < 5);
// 10for…in — 객체의 key 순회
객체의 열거 가능한 속성(key)을 순회할 때 사용한다.
const user = { name: "철수", age: 20, city: "서울" };
for (const key in user) {
console.log(key, user[key]);
}
// name 철수
// age 20
// city 서울- 배열에도 사용할 수는 있지만, 배열의 인덱스도 사실 “key”로 취급하기 때문에 순서 보장이 안 되거나 프로토타입 체인의 속성까지 순회될 수 있어 배열에는 권장되지 않는다. 배열은
for...of나 배열 메서드를 쓰는 게 안전하다.
for…of — 반복 가능한 객체(iterable)의 값 순회
배열, 문자열, Map, Set처럼 반복 가능한(iterable) 객체의 값을 순회할 때 사용한다.
const arr = [10, 20, 30];
for (const value of arr) {
console.log(value);
}
// 10 20 30const str = "hi";
for (const char of str) {
console.log(char);
}
// h i일반 객체({})는 기본적으로 iterable이 아니기 때문에 for...of로 바로 순회할 수 없다. 객체를 순회하고 싶다면 Object.keys(), Object.values(), Object.entries()로 배열 형태로 변환한 뒤 for...of를 쓰는 방식이 흔히 쓰인다.
const user = { name: "철수", age: 20 };
for (const [key, value] of Object.entries(user)) {
console.log(key, value);
}
// name 철수
// age 20for...of가 iterable 객체를 순회할 수 있는 이유는 내부적으로 Symbol.iterator를 구현하고 있기 때문인데, 이 부분은 이후 “이터레이터와 제너레이터” 글에서 더 자세히 다룬다.
정리 — for…in vs for…of
| 구분 | 순회 대상 | 주 사용처 |
|---|---|---|
| for…in | 객체의 key(속성 이름) | 일반 객체 |
| for…of | iterable의 값 | 배열, 문자열, Map, Set 등 |