IT Study/JavaScript

JavaScript의 입출력 (readline 모듈, fs 모듈) +다양한 방식의 반복문 출력

짹짹체유 2023. 8. 23. 19:44

JavaScript의 입출력

1. readline 모듈

readline은 따로 설치가 필요없는 내장 모듈이며, 한 번에 한 줄씩 읽음
모듈을 불러오기 위해서는 readline(모듈 이름)의 형태

# 모듈 불러오기
const readline = require("readline")

# 객체 만들기
const rl = readline.createTnterface( {
	input: prodess.stdin,
    output: process.stdout,
});
const는 선언한 변수가 상수임을 의미 값 변경 불가능

 

 

2. 메소드

1) on 메소드

이벤트 발생할 때, 실행할 동작을 지정

on(사용할 이벤트 명, 콜백함수)

 

rl.on("line", function(x) {
	console.log(x)
}).on("close", function({
});

1-1) line 이벤트

사용자의 입력을 받기 위해 사용하는 입력 이벤트
입력 스트림에 줄바꿈을 나타내는 \n or \r or \r\n 제어 문자나 사용자가 Enter or Return을 누를 때 발생

 

1-2) close 이벤트

입력 끝나고 어떤 이벤트를 동작할지 지정

+ 메서드 체이닝(Method Chaining)
이름이 Chaining인 것가 연관되어, 연속적인 코드의 줄에서 개체의 메서드를 반복적으로 호출하는 것을 의미
위 코드에서 .on("close", ~)에 해당하는 부분

 

3. fs 모듈

const fs = require("fs");
const input=fs.readFileSync("ldevlstdin").toString()

버퍼라는 변환된 값을 바당와서 디코딩을 해줄 필요가 있음 -> toString() 사용
toString(인코딩 옵션)의 형태이며, default 값은 utf8

 

4. readline vs fs

readline은 한 줄씩 읽어보는 반면, fs는 파일을 한 번에 다 읽어옴
readline은 한 줄씩 읽기 때문에 close가 필요한 반면, fs는 close가 없음
상대적으로 fs의 코드의 길이가 더 짧음

 

5. readline 모듈 실습 문제

1. 여러 개를 입력 받고 개별 출력

구분자 쉼표를 기준으로 첫 줄에 여러 개의 숫자를 입력 받음

 

방법1) for 반복문으로 출력하기

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", function (line) {
    input = line.split(',')
    for (let i = 0; i < input.length; i++) {
        console.log(input[i]);
    }
    rl.close();
}).on("close", function () {
});

 

방법2) forEach 활용하기

forEach는 arr.forEach(callback, thisArg)

  • forEach는 callback()을 주어진 배열에 있는 각 요소에 대해 오름차순으로 한 번씩 실행
  • callback은 (현재 처리할 요소, 처리할 요소의 인덱스, forEach()를 호출할 배열)을 매개변수로 받음
  • thisArg는 callback()을 실행할 때 this로 사용할 값
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", function (line) {
    input = line.split(',');
     rl.close();
}).on("close", function () {
	input.forEach(num => {
    	console.log(num)});
});
for vs forEach
for은 몇 번 실행하는지 정해져있지만, forEach는 값이 있는 만큼 실행

 

방법3) map 활용하기

  • forEach와 유사
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", function (line) {
    input = line.split(',');
    rl.close();
}).on("close", function () {
	input.map(num => {
    	console.log(num)});
});
forEach vs map
forEach: 배열 요소 각각에 대해 실행
map: 배열 내의 모든 요소 각각에 대해 주어진 함수를 호출한 결과를 모아 새로운 배열 반환

 

방법4) for of 활용하기

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", function (line) {
    input = line.split(',');
    rl.close();
}).on("close", function () {
	for (const v of input) {
    	console.log(v)};
});

 

방법5) join 활용하기

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", function (line) {
    input = line.split(',');
    rl.close();
}).on("close", function () {
	input = input.join('\n')
    	console.log(input);
});

 

6. readline을 fs로 변환하는 연습

1. 여러 개를 입력 받고 개별 출력

const input = require('fs').readFileSync('파일경로').toString().split(',').map(Number);

console.log(input.join('\n'));

.map(Number)는 배열 내의 값들을 숫자로 넣는다는 것

 

반응형