프로그래밍 숲

우테코 6기 | woowacourse/mission-utils Console 뜯어보기 본문

프로그래밍_인포/Javascript

우테코 6기 | woowacourse/mission-utils Console 뜯어보기

jjscript 2023. 10. 27. 00:39
728x90
반응형

우테코의 woowacourse/mission-utilsconsole.js에는 Console 클래스가 있다. 1주차 과제 때는 그냥 생각없이 썼는데, 이렇게 대충하면 학습의 의미가 없으니 오랜만에 코드를 정리하며 블로그에 글을 써보려고 한다.

우선 코드는 다음과 같다.

import readline from "readline";

class Console {
  constructor() {}

  static readLineAsync(query) {
    return new Promise((resolve, reject) => {
      if (arguments.length !== 1) {
        reject(new Error("arguments must be 1"));
      }

      if (typeof query !== "string") {
        reject(new Error("query must be string"));
      }

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

      rl.question(query, (input) => {
        rl.close();
        resolve(input);
      });
    });
  }

  static print(message) {
    console.log(message);
  }
}

export default Console;

readLineAsync와 Promise

Console 클래스의 readLineAsync 메서드는 query를 인자로 받는다.

이 메서드는 새로운 Promise를 반환한다. Promise는 비동기 작업의 최종 완료(또는 실패)를 나타내며, 이 작업이 완료되면 결과를 반환하거나 오류를 발생시킨다. resolve는 Promise가 성공적으로 실행되었을 때 호출되며, reject는 Promise가 실패했을 때 호출되어 오류를 반환한다.

이 함수에서는 query가 하나의 인자만 받았는지 확인하는 조건이 있는데, 이 때 arguments 를 활용한다. arguments는 함수 내에서 사용할 수 있는 유사 배열 객체로, 함수에 전달된 인자들을 담고 있다. arguments 객체는 배열처럼 인덱스를 사용해 접근할 수 있지만, 실제 배열은 아니라서 Array 프로토타입에 정의된 메서들을 사용할 수는 없다. 따라서 ES6 이후에는 많은 개발자들이 가변적인 수의 인자를 다룰 때 arguments 객체보다 나머지 매개변수 (…rest)를 사용하는 것을 선호한다. 나머지 매개변수는 실제 배열이기 때문에 map, filter, reduce 등의 배열 메서드를 직접 사용할 수 있다.

createInterface()

createInterface()는 Node.js의 readline 모듈에서 제공하는 메서드이다. 이 메서드를 사용하면 사용자의 입력을 처리하고 터미널 또는 콘솔에서 사용자와 상호작용할 수 있는 인터페이스를 생성할 수 있다. 이 중 input과 output 스트림을 설정하는 것이 일반적이다.

스트림(Stream)은 Node.js에서 데이터를 처리하고 전송하는 방식 중 하나이다. 스트림은 데이터를 작은 조각으로 나눠서 처리하며, 이를 통해 메모리를 효율적으로 사용하고 빠르게 데이터를 전송할 수 있다.

스트림은 데이터를 비동기식으로 처리한다. 데이터를 읽거나 쓸 때 전체 데이터가 아닌 조각을 다루기 때문에, 큰 파일이나 데이터를 다룰 때 메모리 효율성이 높다.

  • input 옵션은 사용자의 입력을 받아들일 읽기 가능한 스트림(readable stream)을 설정한다.
    • 일반적으로 process.stdin을 사용하여 터미널 또는 콘솔에서 사용자의 키 입력을 받아들인다.
  • output 옵션은 사용자의 출력을 보내기 위한 쓰기 가능한 스트림(writable stream)을 설정한다.
    • 일반적으로 process.stdout을 사용하여 터미널 또는 콘솔에 데이터를 출력한다.

question()

r1.question() 메서드는 Node.js의 readline 모듈에서 제공하는 메서드로, 사용자에게 질문을 하고 사용자의 입력을 받기 위해 사용된다. 이 메서드는 두 개의 매개변수를 받는다.

  1. 사용자에게 보여질 질문 문자열
  2. 사용자로부터 입력을 받은 후 호출될 콜백 함수. 이 콜백 함수는 사용자의 입력을 매개변수로 받는다.

rl.close() 메서드를 호출하는 것은 중요하다. 이 메서드를 호출하지 않으면 프로그램이 계속 실행 상태로 남아있게 되어 터미널에서 더 이상 입력을 받지 않는다.

resolve()

resolve(input)는 JavaScript의 Promise 객체와 관련된 함수 호출이다. 이 코드는 비동기적으로 처리되는 데이터나 상황의 최종 결과를 처리하기 위해 사용된다.

Promise 객체는 세 가지 상태 중 하나를 가진다.

  1. pending: 초기 상태. 연산이 완료되지 않았습니다.
  2. fulfilled: 연산이 성공적으로 완료되었습니다.
  3. rejected: 연산이 실패하였습니다.

resolve 함수는 Promise 객체를 fulfilled 상태로 바꾸고, 주어진 값을 Promise의 결과 값으로 설정합니다. resolve 함수가 호출되면, Promise 객체에 연결된 .then() 메서드에 정의된 콜백 함수들이 실행됩니다.

728x90
반응형
Comments