자바스크립트의 입출력
readline 모듈
자바스크립트에서 입출력을 하기 위한 readline 모듈에 대해 알아보겠습니다.
readline 모듈은 자바스크립트에 내장된 모듈로 Readable 스트림에서 한 줄씩 입출력을 처리할 수 있도록 도와줍니다.
모듈 불러오기
모듈을 불러오기 위해서는 require(모듈 이름)를 이용해야 합니다.
const readline = require("readline");
불러온 모듈은 readline이라는 변수에 저장합니다.
여기서 const는 선언한 변수가 상수임을 나타내며, 해당 변수의 값을 변경하는 것은 불가능합니다.
readline interface 객체 만들기
정의한 변수를 이용해 readline interface 객체를 하나 만듭니다.
readline interface 객체를 이용해 콘솔에서 표준 입출력을 처리할 수 있습니다.
createInterface() 메소드를 이용해 객체를 만들고, rl이라는 변수에 저장해줍니다.
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
on 메소드
생성한 rl 객체로 입출력과 관련된 여러 이벤트들을 처리할 수 있습니다.
이벤트란 어떤 사건을 의미하며, 예를 들어 사용자가 콘솔에 입력을 넣는 것과 같은 사건을 의미합니다.
on 메소드를 이용하면 이벤트가 발생할 때 실행할 동작을 지정할 수 있습니다.
line 이벤트
readline interface를 통해 다룰 이벤트는 "line" 이벤트로 사용자가 콘솔에 입력을 할 때 발생합니다.
입력 이벤트는 입력 스트림에 줄바꿈을 나타내는 (역슬래시)\n, \r, or \r\n 제어 문자가 나타나거나, 사용자가 Enter 또는 Return을 누를 때 발생하게 됩니다.
아래와 같이 작성하면 사용자가 입력한 한 줄을 그대로 다시 출력할 수 있습니다.
rl.on("line", function (x) {
console.log(x);
});
즉 사용자가 입력 이벤트를 발생시키면, x 변수를 통해 사용자가 입력한 내용이 저장되고 이를 콘솔에 출력하고 있는 것입니다.
close 이벤트
또 다른 이벤트로 "close" 이벤트가 있습니다.
"close" 이벤트는 Readable 스트림 종료를 제어하는 이벤트이며, "line" 이벤트와 비슷한 형태로 작성합니다.
.on("close", function () {
});
해당 이벤트는 더 이상 입력 받을 것이 없을 때 rl.close()를 호출하여 발생시킵니다.
따라서 "line" 이벤트와 함께 아래와 같이 사용됩니다.
rl.on("line", function (x) {
console.log(x);
rl.close(); // 입력 종료
}).on("close", function () {
// 입력 종료 후 동작할 코드
});
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
// 한 줄씩 입력받은 후 실행할 코드
// 입력된 값은 line에 저장된다.
rl.close(); // close가 없으면 입력을 무한히 받는다.
});
rl.on("close", () => {
// 입력이 끝난 후 실행할 코드
});
여러 줄 입출력 처리하기
위와 같은 한 줄 입력을 처리하는 것 외에 여러 줄의 입력을 처리해야 할 수도 있습니다.
여러 줄의 입력을 처리해야 하는 경우 현재의 입력이 몇 번째 입력인지 변수를 만들어 조건문으로 처리할 수 있습니다.
var count = 0; // 몇 번째 입력인지 기록
rl.on("line", function (x) {
count += 1; // 입력 횟수가 증가
if (count === 1) {
// 첫 번째 입력인 경우 동작
} else if (count === 2) {
// 두 번째 입력인 경우 동작
} else if (count === 3) {
// 세 번째 입력인 경우 동작
} else {
// 네 번째 입력인 경우 동작
rl.close(); // 입력 종료
}
}).on("close", function () {
// 입력 종료 후 동작할 코드
});
N줄 입력 처리하기
만약 주어지는 입력의 줄 수가 일정하지 않다면, 위에 코드를 응용하여 아래와 같이 작성할 수도 있습니다.
예를 들어 첫 번째 줄에 앞으로 주어질 입력의 수가 주어지고, 그 뒤에 입력이 주어진다고 해봅시다.
3 // 앞으로 주어질 입력의 개수 N개
a
b
c
그러면 첫 번째 줄에 입력된 숫자를 변수에 저장해두었다가, count 변수가 그 숫자보다 커질때까지 입력을 받으면 됩니다.
var count = 0; // 몇 번째 입력인지 기록
var N = 0; // 첫 번째 줄에 입력된 N
var input = [];
rl.on("line", function (x) {
count += 1; // 입력 횟수가 증가
if (count === 1) {
// 첫 번째 입력인 경우 앞으로 주어질 입력 개수 기록
N = x;
} else {
// 이후 입력되는 N개의 입력은 배열에 저장
input.push(x);
}
if (count > N) {
// N번 입력을 받은 뒤 종료
rl.close();
}
}).on("close", function () {
// 입력 종료 후 동작할 코드
console.log(input);
});