나는 프로그래머스에서 코테 문제를 풀고있는데, 가끔 '000 출력하기' 라는 문제를 보게 된다
처음에 이런 유형의 문제를 봤을때 어디서부터 뭐가 뭐고 어떻게 출력하라는거지?? 하면서 되게 당황했던 기억이 있다
대충 맨 밑에서 console.log로 출력해서 문제를 풀었는데 코드에 대해 좀 알아야겠다는 생각이 들어서 포스팅 해본다.
아래는 입력받은 값을 출력하는 문제의 코드이다.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let input = [];
rl.on('line', function (line) {
input = [line];
}).on('close',function(){
str = input[0];
console.log(str) // 문제 풀면서 작성한 부분
});
프로그래머스에서는 (내가 기초 문제를 풀고있어서 인지는 모르겠지만) 입력 받는 코드가 모두 구현되어있고 출력 하는 부분만 작성하도록 되어있다.
이때 readline 모듈로 구현되어있는데, 아래 블로그를 보고 fs 모듈도 있다는 것을 알게 되었다.
https://velog.io/@bigsaigon333/
readline 은 CLI 애플리케이션, 명령줄 도구를 만들 때 매우 유용하며, 사용자 입력 처리를 간단하게 해주는 Node.js 표준 모듈이다.
따라서 createInterface를 MDN에 검색해도 결과가 나오지 않는다. 이는 Node.js 에서 제공하는 기능이기 때문이다.
commonJS 모듈 시스템 문법으로 해당 모듈을 호출한다.
ES6의 import와 동일한 역할을 한다.
const readline = require('readline');
readline.createInterface() 함수를 사용하여 인터페이스를 생성한다.
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
input : 입력 스트림
output : 출력 스트림
이 두가지를 연결하여 상호작용하는 인터페이스를 만들어준다.
process.stdin , process.stdout 는 Node.js에서 제공하는 표준 입출력 스트림이다. 터미널에서 입/출력을 받을때 사용한다.
스트림 : 데이터 흐름
데이터가 연속적으로 전달되는 과정을 추상화한 개념
프로그램에서 입출력 스트림은 입력한 데이터를 한번에 모두 처리하지 않고 조각 단위로 데이터를 읽거나 쓰는 방식 사용
readline.Interface 객체를 반환하며 변수 rl에 할당된다.
입력을 받고 처리하는 메서드(rl.question, rl.on, rl.close 등)를 사용할 수 있다.
rl.on('line', function (line) {
input = [line];
}).on('close',function(){
str = input[0];
console.log(str) });
여기서 .on() 메서드로 이벤트 리스너가 할당된 것이었다.
rl.on(event, listener)
line 이벤트가 발생할때 function(line){ ... } 를 호출하고
close 이벤트가 발생할때 function(){...} 를 호출한다.
line 이벤트 : 사용자가 입력을 완료하고 엔터 키를 눌렀을때 발생 = 즉, 한 줄의 데이터를 처리
close 이벤트 : 인터페이스 종료
.question()을 사용한 예시
// 사용자 입력 요청
rl.question('당신의 이름은 무엇인가요? ',(answer) =>{console.log(`안녕하세요, ${answer}님!`);
// 입력한 이름 출력
rl.close(); // 인터페이스 종료
이제 괴상하게만 보였던 readline 코드가 좀 눈에 들어온다
왠지 모르게 기피하던 걸 하나하나 뜯어보니 이해가 되어서 기분이 좋다 ㅎ
'개발 공부 일지 > JavaScript' 카테고리의 다른 글
DOM 요소 자체를 변수에 저장하자 (1) | 2025.02.04 |
---|---|
함수에서 this 바인딩 (2) | 2025.02.01 |
스크롤 이벤트를 지양하고 Intersection Observer 를 써야 하는 이유 (0) | 2025.01.16 |
Intersection Observer API로 스크롤 기반 네비게이션 구현하기 (0) | 2025.01.16 |
File vs FileList (FormData에 문자열 배열을 추가하면 FileList가 된다?) (0) | 2025.01.08 |