icon안동민 개발노트

조건문과 반복문


 자바스크립트에서 조건문과 반복문은 프로그램의 흐름을 제어하는 핵심 구조입니다.

 이 절에서는 다양한 조건문과 반복문의 사용법과 적용 사례에 대해 알아보겠습니다.

조건문

  1. 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");
}
  1. 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).

  1. 삼항 연산자

 간단한 조건문을 한 줄로 표현할 수 있습니다.

let age = 20;
let status = (age >= 18) ? "성인" : "미성년자";

 장점 : 간결한 코드

 단점 : 복잡한 조건에서는 가독성이 떨어질 수 있음

반복문

  1. for 루프

 정해진 횟수만큼 반복할 때 주로 사용합니다.

for (let i = 0; i < 5; i++) {
    console.log(i); // 0부터 4까지 출력
}
  1. while 루프

 조건이 참인 동안 계속 반복합니다.

let i = 0;
while (i < 5) {
    console.log(i);
    i++;
}
  1. do...while 루프

 조건 검사 전에 코드 블록을 최소한 한 번 실행합니다.

let i = 0;
do {
    console.log(i);
    i++;
} while (i < 5);
  1. for...in 루프

 객체의 열거 가능한 속성을 순회합니다.

let person = {name: "John", age: 30, job: "developer"};
 
for (let key in person) {
    console.log(key + ": " + person[key]);
}
  1. 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 루프를 조합하여 효율적인 버블 정렬을 구현했습니다.

최적의 사용을 위한 조언

  1. 가독성 : 복잡한 조건은 변수나 함수로 분리하여 의미를 명확히 합니다.
// 좋지 않은 예
if (age >= 18 && (status === "student" || status === "unemployed")) {
    // ...
}
 
// 좋은 예
function isEligible(age, status) {
    return age >= 18 && (status === "student" || status === "unemployed");
}
 
if (isEligible(age, status)) {
    // ...
}
  1. 성능 : 루프 내에서 불필요한 연산을 피합니다.
// 좋지 않은 예
for (let i = 0; i < array.length; i++) {
    // array.length를 매번 계산
}
 
// 좋은 예
for (let i = 0, len = array.length; i < len; i++) {
    // len은 한 번만 계산
}
  1. 적절한 루프 선택 : 상황에 맞는 루프를 사용합니다.
  • 정해진 횟수만큼 반복 : for
  • 객체 속성 순회 : for...in
  • 배열 요소 순회 : for...of
  • 조건에 따른 반복 : while
  1. 조기 반환 : 복잡한 중첩 조건문 대신 조기 반환을 사용하여 코드를 단순화합니다.
// 좋지 않은 예
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;
}
  1. 무한 루프 주의 : 루프의 종료 조건을 명확히 하고, 필요한 경우 안전장치를 마련합니다.

 조건문과 반복문은 자바스크립트 프로그래밍의 기본 구성 요소입니다. 이들을 효과적으로 사용하면 복잡한 로직을 구현하고 데이터를 효율적으로 처리할 수 있습니다.

 조건문을 사용할 때는 조건의 복잡성과 가독성을 고려해야 합니다. 간단한 조건은 삼항 연산자를 사용하여 간결하게 표현할 수 있지만, 복잡한 조건은 if...else 문을 사용하여 명확히 표현하는 것이 좋습니다.

 반복문을 선택할 때는 데이터 구조와 반복의 목적을 고려해야 합니다. 배열을 순회할 때는 for...of를 사용하고, 객체의 속성을 순회할 때는 for...in을 사용하는 것이 적절합니다. 또한, 성능이 중요한 경우 traditional for 루프가 여전히 가장 빠른 선택일 수 있습니다.

 breakcontinue를 적절히 사용하면 루프의 효율성을 높일 수 있습니다. 하지만 과도한 사용은 코드의 흐름을 복잡하게 만들 수 있으므로 주의해야 합니다.

 마지막으로, 조건문과 반복문을 사용할 때는 항상 코드의 가독성과 유지보수성을 고려해야 합니다. 복잡한 로직은 작은 함수로 분리하고, 의미 있는 변수 이름을 사용하여 코드의 의도를 명확히 표현하는 것이 중요합니다.