프로그래머스 코테 연습 자바스크립트 Lv.0을 처음 시작하자마자 접하게 된 readline 모듈. 분명 기초 강의에 언급조차 된 적 없으니 당황할 수 밖에 없는 이 기본적인 모듈에 대해 이해하기 위해 정리한다. 공식문서와 다른 분들의 블로그 내용 참고함.
readline
readline 모듈은 Readable stream(such as `process.stdin`)에서 한 번 에 한 줄씩 데이터를 읽기 위한 인터페이스를 제공한다.
(Node.js 의 정의이지만 어려우니 패스...)
사용법
1. 모듈 불러오기
require() 함수를 통해 readline 모듈을 불러온다.
const readline = require('readline')
2. 인터페이스 객체 만들기
interface 객체를 이용해 콘솔에서 표준 입출력 처리를 할 수 있다.
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
3. 입출력 코드 작성하기
rl.on('line', (line) => {
// 입력 받은 값을 처리하는 코드 //
rl. close();
});
rl.on('close', () => {
// 입력이 끝나고 실행하는 코드 //
process.exit();
});
on() 메서드를 연결해서 사용할 수도 있다.
rl.on('line', (line) => {
// 입력 받은 값을 처리하는 코드 //
rl.close();
}).on('close', () => {
// 입력이 끝나고 실행하는 코드 //
process.exit();
});
4. 코드 설명
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on('line', (line) => {
// 입력 받은 값을 처리하는 코드 //
rl.close();
}).on('close', () => {
// 입력이 끝나고 실행하는 코드 //
process.exit();
});
- 입력 부분
- rl.on() : 인터페이스가 가지는 on() 메서드를 사용해 이벤트와 콜백함수를 전달한다. 아래 코드에서 사용된 이벤트로는 "line"이벤트와 출력 부분에서 사용하는 "close" 이벤트가 있다.
- 'line' : 입력 받은 값을 한 줄씩 읽어 문자열 타입으로 전달하는 역할을 하는 이벤트.
- // 입력 받은 값을 처리하는 코드 // : 'line' 이벤트로 받은 내용을 적절하게 처리하는 코드.
- rl.close() : 인터페이스를 종료하여 무한히 입력 받는 것을 방지. 그 후 다시 이벤트로 close를 작성하여 입력이 끝난 후 실행되어야 할 함수를 작성.
- 출력 부분
- 'close' : 더이상 입력되는 값이 없을 떄 실행되는 이벤트.
- // 입력이 끝나고 실행하는 코드 // : 입력이 종료되었음을 알리는 'close' 이벤트가 호출된 다음 입력값을 활용해 출력값을 도출하는 코드를 작성.
- process.exit() : 프로세스를 종료.
입력 받은 값을 처리하는 방법
입력 받은 값은 바로 사용하기 어렵다. 'line' 이벤트는 값이 한 줄씩 문자열 형태로 입력되어 저장된다. 예를 들어 10 20 30 은 실제로 문자열 '10 20 30'으로 들어온다. 하지만 우리가 사용하고 싶은 값은 숫자 데이터인 10, 20, 30인 경우가 많다.
따라서 문자열 '10 20 30' 안에 들어있는 개별 값들을 사용할 수 있도록 배열 [10, 20, 30]의 형태로 변환해야 한다. 이를 // 입력 받은 값을 처리하는 코드 // 영역에서 처리해준다.
공백을 포함한 한 줄이 입력되는 경우
입력 예시
10 20 30
- 개별 숫자 10, 20, 30을 사용하고 싶다면 우선 공백을 기준으로 나눠줘야 한다.
- 다음으로 공백으로 나뉜 각각의 문자열을 숫자로 바꿔야 한다. 만약 문자열 그대로 사용하고 싶다면 이 과정을 생략하고 공백이 아닌 쉼표로 되어 있다면 쉼표로 나누면 된다.
- 마지막으로 배열에 개별 숫자들을 차례로 담아준다. (입력 값이 정수이기 때문에 parseInt() 메서드도 사용)
// 각각의 값들을 담을 빈 배열을 생성한다.
let input = [];
// split(' ')으로 공백을 기준으로 나누고, map()을 사용해 숫자들을 배열에 담아준다.
input = 문자열.split(' ').map(element => parseInt(element));
최종 코드
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let input = [];
rl.on('line', (line) => {
input = line.split(' ').map(element => parseInt(element));
rl.close();
});
rl.on('close', () => {
// 입력이 끝나고 실행하는 코드 //
process.exit();
});
여러 줄이 입력되는 경우
입력 예시
10
20
30
우선 'line' 이벤트는 한 줄씩 읽어들이기 때문에 각각의 입력을 한 번에 처리할 수 없다. 따라서 각각의 입력이 들어올 때마다 배열에 담아주는 형태로 작성해야 한다.
이는 push() 메서드를 사용해 차례로 담으면 된다. 숫자의 경우 정수로 담고 싶으면 parseInt() 메서드를 사용한다.
// 각각의 값들을 담을 빈 배열을 생성한다.
let input = [];
// line에 입력값이 들어올 때마다 배열에 push해준다.
input.push(line);
// 정수 형태로 push하고 싶다면?
input.push(parseInt(line));
최종 코드
const readline = require('readline');
const rl = readline.createInterface({
input: stdin,
output: stdout
});
let input = [];
rl.on('line', (line) => {
input.push(line);
rl.close();
});
rl.on('close', () => {
// 입력이 끝나고 실행하는 코드 //
process.exit();
});
작성에 참고한 글
'JavaScript' 카테고리의 다른 글
[JavaScript] 배열 합치기 3가지 방법 (0) | 2023.06.26 |
---|---|
[JavaScript] 배열 slice 메서드 (0) | 2023.06.23 |
[JavaScript] 배열 sort 메서드 (0) | 2023.06.22 |
[JavaScript] 배열 map 메서드 (0) | 2023.06.21 |
[JavaScript] 배열 reduce 메서드 (0) | 2023.06.20 |