[Js] - 콘솔창에 입력하기
자바스크립트에서는 readline 모듈을 이용하면 콘솔을 통해 값을 입력받을 수 있다.
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(){
// 입력 종료 후 동작할 코드
})
여러 줄 입출력 처리하기
위와 같은 한 줄 입력을 처리하는 것 외에 여러 줄의 입력을 처리해야 할 수도 있다.
여러 줄의 입력을 처리해야 하는 경우 현재의 입력이 몇번째 입력인지 변수를 만들어 조건문으로 처리할 수 있다.
let count = 0; // 몇 번째 입력인지 기록
rl.on("line", function(x){
count ++; // 입력 횟수가 증가
if(count === 1){
// 첫번째 입력인 경우 동작
} else if (count === 2){
// 두번째 입력인 경우 동작
} else if (count === 3) {
// 세번째 입력인 경우 동작
} else {
// 네번째 입력인 경우 동작
rl.close(); // 입력 종료
}
}).on("close", function(){
// 입력 종료 후 동작할 코드
});
N줄 입력 처리하기
만약 주어지는 입력의 줄 수가 일정하지 않다면, 위에 코드를 응용하여 아래와 같이 작성할 수도 있다.
예를 들어 첫번째 줄에 앞으로 주어질 입력의 수가 주어지고, 그 뒤에 입력이 주어진다고 가정하였을 때,
3 // 앞으로 주어질 입력의 개수 N개
a
b
c
그러면 첫번째 줄에 입력된 숫자를 변수에 저장해두었다가, count 변수가 그 숫자보다 커질때까지 입력을 받으면 된다.
let count = 0; // 몇 번째 입력인지 기록
let N = 0; // 첫번쨰 줄에 입력된 N
let input = [];
rl.on("line", function(x){
count++; // 입력 횟수가 증가
if(count === 1){
// 첫번째 입력인 경우 앞으로 주어질 입력 개수 기록
N = x;
} else {
// 이후 입력되는 N개의 입력은 배열에 저장
input.push(x);
}
if(count > N){
rl.close();
}
}).on("close", function(){
// 입력 종료 후 동작할 코드
console.log(input);
});
출처 - 엘리스 k-디지털 트레이닝 프리트랙 과정