조건문

조건문(Conditionals)은 특정 조건에 따라 어떤 동작을 수행할 것인지 명령하기 위한 표현문입니다. 이 문서에서는 JavaScript에 존재하는 두 가지 조건문을 소개합니다.

if 문

기본적인 if 문의 구문은 아래와 같습니다.

if (condition) {
    // condition이 true일 시 실행할 코드
}

// 다음으로 실행할 코드

if 문의 소괄호 내에는 평가할 조건이 들어갑니다. 조건의 불리언 값이 true일 경우 if 블록 내의 코드들을 실행한 후 다음 코드를 실행합니다. 조건의 불리언 값이 false일 경우 if 블록 내의 코드들을 생략한 후 다음 코드를 실행합니다.

if ... else 문

기본적인 if 문은 조건을 만족하지 않았을 경우를 고려하기에 적절하지 않습니다. 그러므로 else 키워드를 함께 사용할 수 있습니다.

if (condition) {
    // condition이 true일 시 실행할 코드
}
else {
    // condition이 false일 시 실행할 코드
}

// 다음으로 실행할 코드

이 표현문을 if...else 문이라고 합니다. 조건의 불리언 값이 true일 경우 if 블록 내의 코드들을 실행한 후 다음 코드를 실행합니다. 조건의 불리언 값이 false일 경우 else 블록 내의 코드들을 실행한 후 다음 코드를 실행합니다.

else if 문

더 많은 조건을 따지고자 할 때 else if 키워드를 사용합니다. else if는 아래와 같이 ifelse 사이에 사용합니다.

if (condition1) {
    // condition1이 true일 시 실행할 코드
}
else if (condition2) { // condition1이 false인 경우 고려합니다.
    // condition2가 true일 시 실행할 코드
}
else if (condition3) { // condition2가 false인 경우 고려합니다.
    // condition3이 true일 시 실행할 코드
}
...
else if (conditionN) { // N-1번째 조건이 false인 경우 고려합니다.
    // conditionN이 true일 시 실행할 코드
}
else {
    // conditionN까지 모두 false일 시 실행할 코드
}

// 다음으로 실행할 코드

else if는 여러분이 필요한 만큼 사용할 수 있으며, else또한 필요하지 않으면 생략할 수 있습니다.

활용: 특정 메시지에 반응하기

이전에 메시지를 전송하는 함수에 대해 다루었습니다. 이를 if 문과 함께 사용해 특정 메시지가 감지되면 어떤 메시지를 전송하는 코드를 작성할 수 있습니다.

메시지가 올 때마다 실행할 코드는 function onMessage(msg) {} 블록 내에 작성합니다.

const bot = BotManager.getCurrentBot();

function onMessage(msg) {
    // 이곳에 코드를 작성할겁니다.
}
bot.addListener(Event.MESSAGE, onMessage);

우선 하나의 메시지에 반응하는 코드를 작성할겁니다. 전송된 메시지의 내용은 msg.content가 담고 있습니다.

주의

아래 예제 코드는 실제 채팅방에서 작동할 경우 채팅방에 피해를 줄 수 있습니다.

const bot = BotManager.getCurrentBot();

function onMessage(msg) {
    msg.reply(msg.content);
}
bot.addListener(Event.MESSAGE, onMessage);

디버깅룸에서 테스트해보면 카카오톡봇이 여러분이 보낸 메시지를 그대로 보내는 것을 확인할 수 있습니다. msg.contentif 문을 이용해 아래와 같은 형식을 구상할 수 있습니다.

if (msg.content === "반응할 메시지") {
    msg.reply("전송할 메시지");
}

이제 '안녕'이라는 메시지를 감지하면 '안녕하세요.' 라고 전송하게 코드를 작성해봅니다.

const bot = BotManager.getCurrentBot();

function onMessage(msg) {
    if (msg.content === "안녕") {
        msg.reply("안녕하세요.");
    }
}
bot.addListener(Event.MESSAGE, onMessage);

디버깅룸에서 테스트해보세요. 다른 메시지에는 반응하지 않다가 '안녕'이라고 보내면 카카오톡봇이 인사를 해줄 것입니다.

당신의 닉네임과 함께 불러주도록 할 수도 있습니다. msg.author.name은 메시지를 보낸 사람의 닉네임을 담고 있습니다.

const bot = BotManager.getCurrentBot();

function onMessage(msg) {
    if (msg.content === "안녕") {
        msg.reply("안녕하세요, " + msg.author.name + "님."); // 또는 msg.reply(`안녕하세요, ${msg.author.name}님.`);
    }
}
bot.addListener(Event.MESSAGE, onMessage);

만약 당신의 닉네임이 'Solo'라면, 당신이 '안녕'이라고 보냈을 때 카카오톡봇이 '안녕하세요, Solo님'이라고 대답할 것입니다.

switch 문

switch 문은 if 문과 비슷하면서도 다른 조건문입니다. if 문은 복잡한 조건을 판별하는데 유용하다면, switch 문은 데이터의 값에 따라 다른 행동을 수행하는데 유용합니다. 구문은 아래와 같습니다.

switch (expression) {
    case value1:
        // 식이 value1일 경우 실행할 코드
        break;
    case value2:
        // 식이 value2일 경우 실행할 코드
        break;
    ...
    case valueN:
        // 식이 valueN일 경우 실행할 코드
        break;
    default:
        // 위의 어느 값에도 해당하지 않을 경우 실행할 코드
}

switch의 소괄호 내에 판별할 식이 들어갑니다. case value1:, case value2:, ..., case valueN:expression이 값이 각각 value1, value2, ..., valueN일 경우를 의미합니다. 각 케이스의 마지막엔 break를 사용하는데, 해당 케이스를 만족해 코드를 실행한 후 switch 문을 탈출하는 키워드입니다. 마지막으로 default:expression이 어떤 케이스에도 해당하지 않을 경우를 의미합니다. 이는 생략해도 무방합니다.

활용: 명령어 처리하기

이전 문서에서 기본 스크립트를 분석하며 명령어에 대해 소개했습니다. 아래 코드를 살펴보겠습니다.

const bot = BotManager.getCurrentBot();

function onCommand(msg) {}
bot.setCommandPrefix("@");
bot.addListener(Event.COMMAND, onCommand);

위 코드에서 명령어는 bot.setCommandPrefix("@");에 의해 '@'로 시작하는, 즉 '@'가 접두어인 메시지로 정의되어있습니다. '@help'나 '@send user1'과 같은 메시지를 명령어로 감지합니다. 만약 bot.setCommandPrefix("/");로 수정하면, '/help'나 '/send user1'과 같은 메시지를 명령어로 감지하게 됩니다.

switch 문을 활용해 명령어를 효율적으로 처리할 수 있습니다. 명령어의 이름을 각 케이스로 구분해 처리합니다. 여기에서 명령어의 이름은 '@help', '@send user1'에서 각각 'help', 'send'와 같은 것입니다. 명령어의 이름은 msg.command가 담고 있습니다. 우리가 처리할 명령어는 '@help', '@time', '@add'로 가정합니다.

const bot = BotManager.getCurrentBot();

function onCommand(msg) {
    switch (msg.command) {
        case "help":
            // 명령어가 @help일 경우 처리할 메시지
            break;
        case "time":
            // 명령어가 @time일 경우 처리할 메시지
            break;
        case "add":
            // 명령어가 @add일 경우 처리할 메시지
            break;
    }
}
bot.setCommandPrefix("@");
bot.addListener(Event.COMMAND, onCommand);

이제 명령어 별로 실행할 코드를 작성합니다. '@help'의 경우, 명령어의 목록을 전송합니다. '@time'의 경우, 현재 시간을 전송합니다. '@add'의 경우, 2개의 명령어 인자를 받은 후 두 인자를 더한 값을 전송합니다.

명령어 인자는 '@add 4 7'에서 각각 '4'와 '7'을 의미합니다. msg.args는 명령어 인자를 문자열 배열로 담고 있습니다. 예를 들어, '@add 4 7'의 경우 ["4", "7"]를 가집니다.

const bot = BotManager.getCurrentBot();

function onCommand(msg) {
    switch (msg.command) {
        case "help":
            msg.reply("@help: 명령어의 목록을 전송합니다. \n@time: 현재 시간을 전송합니다. \n@add [숫자1] [숫자2]: 두 숫자를 더합니다.");
            break;
        case "time":
            let date = new Date(); // 현재 날짜와 시간에 대한 "객체"입니다. 지금은 자세히 다루지 않습니다.
            msg.reply(`현재 시간은 ${date.getHours()}${date.getMinutes()}${date.getSeconds()}초입니다.`);
            break;
        case "add":
            let sum = Number(msg.args[0]) + Number(msg.args[1]); // 두 인자의 요소를 숫자로 형 변환한 후 더합니다.
            msg.reply(`${msg.args[0]} + ${msg.args[1]} = ${sum}`);
            break;
    }
}
bot.setCommandPrefix("@");
bot.addListener(Event.COMMAND, onCommand);

실습하기

Q1. 여러분은 카카오톡봇에게 작별 인사를 할 때도 반응하게 하고 싶습니다. if 문을 사용해 '안녕'이라는 메시지에는 '안녕하세요, (유저이름)님.'을, '잘있어'라는 메시지에는 '안녕히가세요, (유저이름)님'을 보내게 해보세요.

const bot = BotManager.getCurrentBot();

function onMessage(msg) {
    if (msg.content === "안녕") {
        msg.reply(`안녕하세요, ${msg.author.name}님.`);
    }
    else if (msg.content === "잘있어") {
        msg.reply(`안녕히가세요, ${msg.author.name}님.`);
    }
}
bot.addListener(Event.MESSAGE, onMessage);

Q2. 여러분은 Q1.에서 만든 카카오톡봇을 친구들이 모인 방에만 작동시키고 싶습니다. 해당 방의 이름이 '친구들'일 때 '친구들' 방에서만 동작하도록 코드를 수정해보세요. (메시지가 온 방의 이름은 msg.room에 담겨 있습니다.)

const bot = BotManager.getCurrentBot();

function onMessage(msg) {
    if (msg.room === "친구들") { // 방 이름이 '친구들'일 경우 블록 내부의 코드를 실행합니다.
        if (msg.content === "안녕") {
            msg.reply(`안녕하세요, ${msg.author.name}님.`);
        }
        else if (msg.content === "잘있어") {
            msg.reply(`안녕히가세요, ${msg.author.name}님.`);
        }
    }
}
bot.addListener(Event.MESSAGE, onMessage);
const bot = BotManager.getCurrentBot();

function onMessage(msg) {
    if (msg.room !== "친구들") return; // 방 이름이 '친구들'이 아닐 경우 코드의 실행을 중지합니다.

    if (msg.content === "안녕") {
        msg.reply(`안녕하세요, ${msg.author.name}님.`);
    }
    else if (msg.content === "잘있어") {
        msg.reply(`안녕히가세요, ${msg.author.name}님.`);
    }
}
bot.addListener(Event.MESSAGE, onMessage);

Q3. switch 문을 보고 아름다움을 느낀 여러분은 switch 문으로 카페 주문을 받는 카카오톡봇을 만들고자 합니다. 명령어는 '@order [메뉴]'입니다. 메뉴 정보는 아래와 같습니다.

메뉴 정보 (메뉴명 / 전송 문구)
아메리카노
따뜻한 아메리카노 한잔 나왔습니다~
바닐라라떼
부드러운 바닐라 라떼 한잔 나왔습니다~
락스
젓지 말고 흔들어서 한잔 내왔습니다.

명령어를 감지하고 주문한 메뉴에 맞는 문구를 전송하세요. 주문한 메뉴가 존재하지 않는 메뉴일 경우 '존재하지 않는 메뉴입니다.'를 전송하세요.

const bot = BotManager.getCurrentBot();

function onCommand(msg) {
    if (msg.command === "order") {
        switch (msg.args[0]) {
            case "아메리카노":
                msg.reply("따뜻한 아메리카노 한잔 나왔습니다~");
                break;
            case "바닐라라떼":
                msg.reply("부드러운 바닐라 라떼 한잔 나왔습니다~");
                break;
            case "락스":
                msg.reply("젓지 말고 흔들어서 한잔 내왔습니다.");
                break;
            default:
                msg.reply("존재하지 않는 메뉴입니다.");
        }
    }
}
bot.setCommandPrefix("@");
bot.addListener(Event.COMMAND, onCommand);