👍   조성개발실록
테마 변경
태그
방명록

일일 학습정리 - Day01

TILJavaScriptNode.js

July 15, 2024



Day_01 기록..

Node.js로 표준 입력 받고싶어요

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

rl.on("line", function (line) {
  console.log(line)
  rl.close()
}).on("close", function () {
  process.exit()
})

이건 딱 한 줄 입력 받는 예제인데
이걸 마개조해서
원할 때마다 입력스트림을 시작하는 함수를 따로 만들어버리고 싶었는데
이게 이벤트 리스너를 기반으로 하는거라 좀 쉽지 않았다
rl.prompt()같은 것도 발견하긴 했는데
결국에는 아래와 같이 했다

const readline = require("node:readline")
const { stdin: input, stdout: output } = require("node:process")
const { fail } = require("node:assert")
const rl = readline.createInterface({ input, output })
const AM = "AM"
const PM = "PM"

//rl.prompt(); 굳이 없어도 되네
rl.on("line", function (line) {
  if (line === "") rl.close()
  reserve(line)
}).on("close", function () {
  process.exit()
})

node.js documentation에서 여기서 쓰인 이벤트나 rl 이런거에 대한 정보를 알 수 있다
rl.prompt()로 입력 스트림을 재개하거나 어쩌구.. 할 수 있다는데
그냥 없이, ""(빈 문자열)이 입력될 때까지 계속 받게 했다. close하지 않고
이렇게 하면 일단은 조건부로 무한정 받을 수 있는거시다 입력을

JavaScript에서 클래스를 만들어요

class MyClass {
  name //name이라는 멤버변수 미리 선언
  #password //#으로 private 설정 가능
  constructor(_name, _role) {
    this.name = _name //미리 선언한 name에 값 할당
    this.role = _role //미리 선언 안 했어도 그냥 이렇게 하면 생김
  }
  getName() {
    return this.name
  }
  setName(_name) {
    this.name = _name
  }
  static thisIsStaticFunction() {}
}

JavaScript에서 class는 속성(property)의 집합인 셈인데..

  • constructor로 생성자를 명시할 수 있다
  • static 붙이면 정적으로 선언할 수 있다
  • 사실 함수도 JavaScript에서는 일급객체라서, 그냥 속성을 추가하듯이 작성하면 됨
  • 기본적으로 모든 속성(property)들은 public인데..
    • 클래스 필드를 private으로해버릴 수 있는 방법이 ES2019부터 추가되었다
    • #(해쉬 라고 읽으면 됨) prefix를 추가하여 private으로 선언할 수 있는 거시다

Factory Method Pattern?

그런데 하고 싶은 것이 있었는데
팩토리 메서드 패턴이다

그러니까 이건..
(1) 먼저 생성자를 private으로 제한
(2) 생성자는 특별한 메서드 (ex: getNewInstance())에서 호출
(3) 이 특별한 객체 생성 메서드에서는 조건에 따라 객체 생성을 결정 (ex: 이미 객체가 10개 생성되었으면 객체 생성 하지 않는다, 등..)
이런 식으로 해서 객체 생성을 한 층 더 캡슐화하고 제어하는 패턴이다

사실 이름이 팩토리 메서드 패턴이 맞는지 모르겠는데,
전에 Java 수업 때 교수님께서 객체지향 패턴 중 하나로 알려주셨던 내용인데
이름이 기억이 안 나서 GPT에게 설명을 주고 이거 이름 뭐냐고 물어봤더니 저거라고 답했다..
근데 또 위 링크의 설명을 보면 살짝? 다른 것 같긴 하다

아무튼, 구체적으로 하고싶었던 것은
입력된 값의 유효성 검사 ---> 유효한 값이면 객체 생성 / 아니면 예외처리
이 과정을 아예 class 내에서 캡슐화하여 getNewInstance(input) 이런걸 넣으면,
유효 값인 경우, 객체를 생성하여 리턴, 아니면 null이든 false든 예외 반환
이렇게 하고 싶었다
그런데 어라? JavaScript에서 생성자를 private으로 생성하는 방법은 없는 듯하다
(#도 안 되고, 다른 방법을 검색해봐도 안 나오는데.. 방법을 아신다면 알려주세요)
그래서 일단 생성자를 막지는 않고 그냥 원하는 대로 객체 생성 메서드를 따로 만들었을 뿐이었다