본문 바로가기

개발일지/Node.js

[Node.js] readline 모듈. 콘솔로 값 입력받기

728x90

 

 readline 모듈은 프로그래머스 JS 코테 문제를 풀다가 처음 접하게 되었다. 처음접하는 모듈이 문제로 나와버렸으니 초기화 코드를 하나도 이해하지 못해서 결국 공부를 먼저 하고 문제를 풀어냈는데, 여러 블로그에서 백준 문제를 풀다보면 자주만나게 되는 모듈이라고 하길래 공부를 한 내용을 정리하고자 한다.

 

 


readline?

먼저 Node.js 문서에 적힌 개념은 다음과 같다.

The node:readline module provides an interface for reading data from a Readable stream (such as process.stdin) one line at a time.

이 말을 해석하자면,

Readable stream (process.stdin과 같은)에서 데이터를 한 번에 한 줄씩 읽기 위한 인터페이스를 제공한다.

 

event-driven 방식으로 동작. 특정 이벤트가 발생했을 때 실행되는 코드이다.

 

 

 


readline 사용법

readline 사용법은 3가지로 다음과 같다.

  1. readlien 모듈 가져오기
  2. readlien 모듈 인터페이스 생성
  3. 입출력 처리 코드 생성

 

1. readline 모듈 가져오기

const readline = require("redaline");

 

2. readlien 인터페이스 생성

  • 인터페이스를 생성할 때 process 객체를 사용하는데 이 객체는 nodejs 프로세스의 정보와 제어를 제공해주는 객체이다.
    • 전역객체이기 때문에 require를 사용하지 않아도 사용이 가능하다.
  • stdin, stout은 standard input과 standard output의 약자이다.
const rl = readline.createInterface({
	input: process.stdin,
  output: process.stdout
});

 

3. 입출력 처리 코드 생성

  •  on() : 메서드를 활용하여 이벤트와 콜백함수를 전달한다. 
    • 'line' : 입력받은 값을 한 줄씩 읽어 문자열 타입으로 전달하는 역할을 하는 이벤트이다.
      • // 입력받은 값을 처리하는 코드 // : 'line'이벤트로 받은 내용을 적절하게 처리하는 코드이다.
      • rl.close() : 인터페이스를 종료한다. 무한히 입력 받는 것을 방지한다. rl.close()가 호출되면 입력이 끝났다는 것이고, 다음에 'close' 이벤트를 발생시켜 입력값을 활용하여 출력값을 도출하는 코드를 작성한다.
    • 'close' : rl.close() 함수로 'line'이벤트를 종료시킨다. 더 이상 입력되는 값이 없을 때 실행되는 이벤트이다.
    • // 입력이 끝나고 실행되는 코드 // : 입력이 종료되었음을 알리는 'close'이벤트가 호출된 다음 입력값을 활용해 출력값을 도출하는 코드를 작성한다.
    • process.exit() : 프로세스를 종료시킨다.
// 입출력을 처리하는 코드

rl.on('line', (line) => {
  // 입력 받은 값을 처리하는 코드 //
  rl. close();
});
  
rl.on('close', () => {
  // 입력이 끝나고 실행하는 코드 //
  process.exit();
});

// on()메서드를 연결해서 작성이 가능하다.
rl.on("line", (line) => {
	/*입력받는 값을 처리하는 코드*/
	rl.close();
}).on("close", () => {
	/*입력이 끝나고 실행할 코드*/
	process.exit();
});

 

 

 


입력받은 값을 처리하는 방법

 

👩‍🏫 공백을 포함한 한 줄이 입력되는 경우

입력의 예시가 다음과 같은 경우

10 20 30	// 한 줄

 

  1. 개별 숫자 10, 20, 30을 사용하고 싶다면 공백을 기준으로 문자열을 나눠주어야 한다.
  2. 공백으로 나뉜 각각의 문자열을 숫자로 바꿔주어야 한다. 문자열로 그대로 사용하고 싶다면 이 과정을 생략할 수 있으며, 공백이 아닌 쉼표로 나뉘러져 있다면 쉼표를 기준으로 문자열을 나누면 된다.
  3. 배열에 각 숫자들을 차례로 담는다.
// readline 모듈을 불러온다.
const readline = require("readline");

// readline 인스턴스를 생성한다.
const rl = readline.createInterface({
	input: process.stdin,
    output: process.stdout,
});

//각각의 값들을 담을 빈 배열을 생성한다.
let input = [];
    
// line 이벤트를 실행하는 함수이다.
rl.on("line", (line)=>{
	//split(' ')으로 공백을 기준으로 나누고, map()을 사용해 숫자들을 배열에 담습니다.
    input = line.split(' ').map(element => parseInt(element));
    // line이벤트를 종료시키고 close를 실행시킨다.
   	rl.close();
});

// close이벤트를 실행하는 함수
rl.on("close", ()=>{
/*입력이 끝나고 실행할 코드*/
	// 프로세스를 종료한다.
	process.exit();
});

// -----------------------------------------------------------------
// 매개변수로 콜백함수를 받고 이 콜백함수의 매개변수의 이름은 임의로 지을 수 있다. (매개변수의 이름은 x이다.)
rl.on("line", (x)=>{
    input = x.split(' ').map(element => parseInt(element));
   	rl.close();
});

 

 

👩‍🏫 여러 줄이 입력되는 경우

입력의 예시가 다음과 같은 경우

10 //한 줄
20 //한 줄
30 //한 줄

 

 line 이벤트는 한 줄 씩 읽어들이기 때문에 각각의 입력을 한 번에 처리할 수 없다. 따라서 각각의 입력이 들어올 때마다 배열에 담아주는 형태로 작성해야 한다.

// readline 모듈을 불러온다.
const readline = require("readline");

// readline 인스턴스를 생성한다.
const rl = readline.createInterface({
	input: stdin,
	output: stdout,
});

//각각의 값들을 담을 빈 배열을 생성한다.
let input = [];

rl.on("line", (line)=>{
	//line에 입력값이 들어올 때마다 배열에 push해준다.
	input.push(line);
    // line이벤트를 종료시키고 close를 실행시킨다. 
	rl.close();
});

// close이벤트를 실행하는 함수
rl.on("close", ()=>{
	/*입력이 끝나고 실행할 코드*/
    // 프로세스를 종료한다.
	process.exit();
});

 

 

 

이 모듈을 공부해서 풀어낸 코딩테스트 문제는 '직각삼각형 출력하기'이고, 아래의 링크에 해당 문제를 푼 코드가 있다.

 

[코딩테스트] 230721_직각삼각형 출력하기

직각삼각형 출력하기 const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); let input = []; rl.on('line', function (line) { let star = "" input = line.split(' ').map(el=>{ for(le

oo0ojw.tistory.com

 

 

728x90

'개발일지 > Node.js' 카테고리의 다른 글

[Node.js] Puppeteer  (0) 2023.07.05