
일반적으로 코드는 위에서 아래로 순차적으로 진행된다.
그렇다면 특정 기능을 구현하기 위해 코드의 흐름을 바꾸려면 어떻게 해야할까?
코드의 흐름을 제어하는 제어문에 대해 알아보겠다 🚗 💨 💨
조건문은 특정 조건에 따라 다른 코드를 실행하게 한다.
조건식의 평가 결과에 따라 블록문의 실행을 결정하는데, 이때 조건식은 불리언 값으로 평가될 수 있는 표현식이다.
가장 일반적인 조건문에는 if...else, 삼항연산자, 그리고 switch문이 있다.
조건이 참(True)인지 거짓(False)인지에 따라 다른 작업을 수행한다. 가장 기본적인 조건문 형태다.
let score = 90;
if (score >= 80) {
console.log("합격입니다!");
} else {
console.log("불합격입니다ㅠㅠ");
}
score >= 80 가 조건식에 해당하는 부분으로 score = 90 이므로 조건식이 True가 되어 '합격입니다!'가 출력된다.
만약 조건식을 추가하고 싶다면 else if(조건식) 을 사용하여 좀 더 정교하게 코드를 작성할 수 있다.
조건 ? 표현식1 : 표현식2 형태로, 조건이 참이면 표현식1을, 거짓이면 표현식2를 실행한다. 간단한 조건 판단에 유용하다.
위의 코드를 삼항 연산자로 간단하게 나타내보았다.
let score=90;
result = score >= 80? '합격입니다!' : '불합격입니다ㅠㅠ';
console.log(result);
switch문은 하나의 조건에 대해 여러 경우의 값(case)를 비교할 때 사용한다.
각 case는 특정 값에 따라 실행될 코드 블록을 정의한다.
만약 switch문의 표현식과 일치하는 case문이 없다면 실행 순서는 default문으로 이동한다.
let grade = 'A';
let result;
switch (grade) {
case 'A': result = "우수";
break;
case 'B': result = "양호";
break;
default: result = "미정";
}
console.log(result);
default문에서는 break를 생략하는 것이 일반적이지만 위의 case문의 같은 경우 break를 생략하면 계속해서 다음 case문으로 이동하므로 각 case마다 break문을 작성해야 한다.
두 반복문의 차이를 명확히 이해하기 위한 예제 코드이다.
node에서 실행해보길 바란다.
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout,
});
readline.question(
'주문할 음료를 선택하세요 (1)아메리카노 (2)카페라테 (3)티 (4)베이커리 : ',
(menu) => {
let orderOptions;
const menuNum = parseInt(menu, 10); // readline으로 입력받은 인풋은 문자열 타입이므로 menu를 숫자로 변환
switch (menuNum) {
case 1:
case 2:
case 3:
orderOptions = 'Ice, Hot, Add Shot, Add Syrup';
break;
case 4:
orderOptions = 'Cake, Bread, Snack';
break;
default:
console.log('주문을 확인해주세요.');
readline.close();
return;
}
console.log(`선택하신 메뉴: ${menuNum}, 가능한 옵션: ${orderOptions}`);
readline.question('메뉴의 옵션을 선택하세요: ', (option) => {
const lowerOption = option.toLowerCase();
if (
(menuNum === 1 || menuNum === 2 || menuNum === 3) &&
(lowerOption === 'ice' ||
lowerOption === 'hot' ||
lowerOption === 'add shot' ||
lowerOption === 'add syrup')
) {
console.log(`${menuNum}번 음료에 ${option} 옵션을 추가합니다.`);
} else if (
menuNum === 4 &&
(lowerOption === 'cake' ||
lowerOption === 'bread' ||
lowerOption === 'snack')
) {
console.log(`선택하신 베이커리: ${option}`);
} else {
console.log('옵션 선택 없이 주문으로 넘어갑니다.');
}
readline.close();
});
}
);
🧘🏻♀️ 조건문 정리
if...else문은 가장 기본적인 조건문 형태이며 이를삼항연산자로 간단하게 표현할 수 있다. 참, 거짓으로 실행할 코드를 결정할 때는 if...else문을 사용하고, 참 거짓보다는 다양한 상황(case)에 따라 실행할 코드 블록을 결정할때는switch문을 사용한다는 것을 알아보았다.
반복문은 조건이 참인 동안 코드 블록을 반복하여 실행한다. for, while, do...while, break, continue가 여기에 속한다.
가장 일반적인 반복문 형태이다. 정해진 횟수만큼 반복할 때 사용한다. 초기화, 조건 검사, 반복 후 작업(증감 등)을 한 문장으로 작성한다.
for (let i = 0; i < 5; i++) {
console.log(`Number ${i}`);
}
조건이 참인 동안 계속해서 코드 블록을 실행한다. 조건이 더 이상 참이 아니면 반복이 중지된다. for문과 달리 반복 횟수가 불명확할때 사용한다.
let i = 0;
while (i < 5) {
console.log(`Number ${i}`);
i++;
}
최소 한 번 코드 블록을 실행한 후, 조건을 검사하여 추가 실행 여부를 결정한다. while문과 비슷하지만, 최소 한 번은 무조건 실행된다.
let i = 0;
do { //일단 실행된다
console.log(`Number ${i}`);
i++;
} while (i > 5); //조건식이 False임에도
break문은 반복문, swtich문,레이블문을 탈출하여 실행을 중단시킨다. 불필요한 반복을 막을 수 있다. 앞서 말한 3가지 문 이외에 break문을 사용하면 SyntaxError가 발생한다.
continue문은 현재 반복을 건너뛰고 다음 반복으로 넘어간다. 특정 조건에서 반복을 제어할 때 유용하다.
break나 continue에 식별자를 함께 사용하는 것을 레이블문이라고 한다.
레이블문을 사용하면 복잡한 반복문이나 중첩된 반복문 내에서 코드의 흐름을 더 세밀하게 제어할 수 있다.
outer: for (let i = 0; i < 5; i++) { //outer: 식별자
for (let j = 0; j < 5; j++) {
if (i + j === 3) break outer;
console.log(`inner [${i}, ${j}]`);
}
}
console.log('Done!');
🧘🏻♀️반복문 정리
반복문은 조건이 참인 동안 주어진 작업을 반복적으로 실행하도록 하는 프로그래밍 구조이다.
for문은 정해진 횟수만큼 반복할 때,while문은 반복 횟수가 불명확하거나 조건에 따라 반복을 계속할 때, 그리고do...while문은 적어도 한 번은 반드시 실행되어야 할 때 사용한다.break문과continue문을 이용해 반복문의 실행 흐름을 제어할 수 있으며, 복잡한 반복문이나 중첩된 반복문의 제어에 유용하게 사용되는 레이블문을 통해 더 세밀한 제어가 가능하다.