메뉴 정보 (메뉴명 / 전송 문구) | |
---|---|
아메리카노 | 따뜻한 아메리카노 한잔 나왔습니다~ |
바닐라라떼 | 부드러운 바닐라 라떼 한잔 나왔습니다~ |
락스 | 젓지 말고 흔들어서 한잔 내왔습니다. |
조건문
조건문(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
는 아래와 같이 if
와 else
사이에 사용합니다.
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.content
와 if
문을 이용해 아래와 같은 형식을 구상할 수 있습니다.
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);