조건문과 반복문
자바스크립트에서 조건문과 반복문은 프로그램의 흐름을 제어하는 핵심 구조입니다.
이 절에서는 다양한 조건문과 반복문의 사용법과 적용 사례에 대해 알아보겠습니다.
조건문
- if...else 문
가장 기본적인 조건문 구조입니다.
let age = 18;
if (age >= 18) {
console.log("성인입니다.");
} else {
console.log("미성년자입니다.");
}
여러 조건을 체크할 때는 else if
를 사용합니다.
let 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("D");
}
- switch 문
여러 가지 경우 중 하나를 선택할 때 사용합니다.
let day = "Monday";
switch (day) {
case "Monday":
console.log("Start of the work week");
break;
case "Friday":
console.log("End of the work week");
break;
case "Saturday":
case "Sunday":
console.log("Weekend");
break;
default:
console.log("Midweek");
}
break
를 사용하지 않으면 다음 case로 실행이 계속됩니다(fall-through).
- 삼항 연산자
간단한 조건문을 한 줄로 표현할 수 있습니다.
let age = 20;
let status = (age >= 18) ? "성인" : "미성년자";
장점 : 간결한 코드
단점 : 복잡한 조건에서는 가독성이 떨어질 수 있음
반복문
- for 루프
정해진 횟수만큼 반복할 때 주로 사용합니다.
for (let i = 0; i < 5; i++) {
console.log(i); // 0부터 4까지 출력
}
- while 루프
조건이 참인 동안 계속 반복합니다.
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
- do...while 루프
조건 검사 전에 코드 블록을 최소한 한 번 실행합니다.
let i = 0;
do {
console.log(i);
i++;
} while (i < 5);
- for...in 루프
객체의 열거 가능한 속성을 순회합니다.
let person = {name: "John", age: 30, job: "developer"};
for (let key in person) {
console.log(key + ": " + person[key]);
}
- for...of 루프
반복 가능한(iterable) 객체의 값을 순회합니다.
let arr = [1, 2, 3, 4, 5];
for (let value of arr) {
console.log(value);
}
for...in
은 객체의 속성을 순회하고, for...of
는 배열이나 문자열 같은 반복 가능한 객체의 값을 순회합니다.
break와 continue
break
: 루프를 즉시 종료하고 빠져나갑니다.continue
: 현재 반복을 건너뛰고 다음 반복으로 진행합니다.
for (let i = 0; i < 10; i++) {
if (i === 3) continue; // 3을 건너뜀
if (i === 7) break; // 7에서 루프 종료
console.log(i);
}
레이블을 이용한 다중 루프 제어
레이블을 사용하면 중첩된 루프에서 특정 루프를 제어할 수 있습니다.
outerLoop: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (i === 1 && j === 1) {
break outerLoop;
}
console.log(`i = ${i}, j = ${j}`);
}
}
이 코드는 i
가 1이고 j
가 1일 때 바깥쪽 루프까지 완전히 종료됩니다.
알고리즘 구현 예제
다음은 버블 정렬 알고리즘을 구현한 예제입니다.
function bubbleSort(arr) {
let len = arr.length;
let swapped;
do {
swapped = false;
for (let i = 0; i < len - 1; i++) {
if (arr[i] > arr[i + 1]) {
// 요소 교환
let temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
swapped = true;
}
}
} while (swapped);
return arr;
}
console.log(bubbleSort([64, 34, 25, 12, 22, 11, 90]));
이 예제에서는 do...while
루프와 for
루프를 조합하여 효율적인 버블 정렬을 구현했습니다.
최적의 사용을 위한 조언
- 가독성 : 복잡한 조건은 변수나 함수로 분리하여 의미를 명확히 합니다.
// 좋지 않은 예
if (age >= 18 && (status === "student" || status === "unemployed")) {
// ...
}
// 좋은 예
function isEligible(age, status) {
return age >= 18 && (status === "student" || status === "unemployed");
}
if (isEligible(age, status)) {
// ...
}
- 성능 : 루프 내에서 불필요한 연산을 피합니다.
// 좋지 않은 예
for (let i = 0; i < array.length; i++) {
// array.length를 매번 계산
}
// 좋은 예
for (let i = 0, len = array.length; i < len; i++) {
// len은 한 번만 계산
}
- 적절한 루프 선택 : 상황에 맞는 루프를 사용합니다.
- 정해진 횟수만큼 반복 :
for
- 객체 속성 순회 :
for...in
- 배열 요소 순회 :
for...of
- 조건에 따른 반복 :
while
- 조기 반환 : 복잡한 중첩 조건문 대신 조기 반환을 사용하여 코드를 단순화합니다.
// 좋지 않은 예
function getDiscount(user) {
if (user.isPremium) {
if (user.points > 100) {
return 0.2;
} else {
return 0.1;
}
} else {
return 0;
}
}
// 좋은 예
function getDiscount(user) {
if (!user.isPremium) return 0;
if (user.points > 100) return 0.2;
return 0.1;
}
- 무한 루프 주의 : 루프의 종료 조건을 명확히 하고, 필요한 경우 안전장치를 마련합니다.
조건문과 반복문은 자바스크립트 프로그래밍의 기본 구성 요소입니다. 이들을 효과적으로 사용하면 복잡한 로직을 구현하고 데이터를 효율적으로 처리할 수 있습니다.
조건문을 사용할 때는 조건의 복잡성과 가독성을 고려해야 합니다. 간단한 조건은 삼항 연산자를 사용하여 간결하게 표현할 수 있지만, 복잡한 조건은 if...else
문을 사용하여 명확히 표현하는 것이 좋습니다.
반복문을 선택할 때는 데이터 구조와 반복의 목적을 고려해야 합니다. 배열을 순회할 때는 for...of
를 사용하고, 객체의 속성을 순회할 때는 for...in
을 사용하는 것이 적절합니다. 또한, 성능이 중요한 경우 traditional for
루프가 여전히 가장 빠른 선택일 수 있습니다.
break
와 continue
를 적절히 사용하면 루프의 효율성을 높일 수 있습니다. 하지만 과도한 사용은 코드의 흐름을 복잡하게 만들 수 있으므로 주의해야 합니다.
마지막으로, 조건문과 반복문을 사용할 때는 항상 코드의 가독성과 유지보수성을 고려해야 합니다. 복잡한 로직은 작은 함수로 분리하고, 의미 있는 변수 이름을 사용하여 코드의 의도를 명확히 표현하는 것이 중요합니다.