본문으로 건너뛰기
SoulLog

자바스크립트 패턴 — 3.1 원시형

4분 읽기
  • ES5 기준 원시형은 5가지입니다. (String, Number, null, undefined, Boolean)
  • ES6부터 Symbol이 추가되어 원시형은 6가지가 되었습니다.
  • 객체가 아님에도 원시형이 프로퍼티를 사용할 수 있는 이유는 JavaScript에 래퍼객체가 존재하기 때문입니다.
    • 래퍼객체는 String, Number, Boolean (ES6에서는 Symbol까지 포함)의 프로퍼티에 접근할 때 발생하는 임시 객체입니다.
  • 한 번 이상 참조할 상수는 변수에 담아두고, 변수를 대신 참조하는 것이 좋습니다.

이해되지 않는 내용 — SOLID와 원시형

단일 책임 원칙

모든 클래스(자바스크립트의 경우 함수)는 반드시 한 가지 변경 사유가 있어야 한다.

책에서는 "원시형은 일편단심이다"라고 표현합니다. 이 말의 의미는 다음 둘 중 어느 것일까요?

  1. 원시형은 한 가지 이유로만 변한다.
  2. 원시형은 불변이다.

개방/폐쇄 원칙

모든 소프트웨어 개체는 실행 코드를 변경하지 말고, 재사용하고 확장해야 한다.

책에서는 "원시형은 불변값이다"라고 합니다. 하지만 실무에서는 값을 변경하는 것처럼 보이는데, 왜 불변이라고 하는지 의문이 들었습니다.


용어 정리

래퍼객체 (Wrapper Object)

JavaScript에는 래퍼객체(Wrapper Object)라는 것이 존재합니다. 객체가 아님에도 프로퍼티를 참조하려 할 때 잠시 임시로 객체를 생성하여 살펴보는 용도로 활용된 뒤 사라집니다.

let a = 'hello world'
let b = new String(a)
console.log(a.length, b.length) // 11, 11
console.log(a == b, a === b) // true, false
 
a.num = 11
b.num = 11
 
let c = a.num
let d = b.num
 
console.log(a, b, c, d)

변수 a의 문자열에서 length 프로퍼티를 참조할 때는 String 객체 내 프로퍼티 length와 동일한 값을 갖고 있었지만, 이후 새로운 프로퍼티를 추가하고 그 값을 참조하려 할 때는 적용되지 않았습니다.

이렇듯 래퍼객체를 가비지 컬렉션 대상이라 일컫는 이유는, 래퍼객체는 원시형이 값을 참조하고 도움을 얻으려 할 때만 잠시 나타날 뿐 지속성이 없기 때문입니다.

요약하면 래퍼객체의 동작 방식은 다음과 같습니다.

  1. 원시형(String, Number, Boolean, Symbol)이 객체들만 접근할 수 있는 프로퍼티에 접근을 원합니다.
  2. 래퍼객체가 해당 원시형에게 일시적으로 객체 자격을 임시 부여합니다.
  3. 원시형이 해당 프로퍼티를 확인합니다.
  4. 확인이 끝나면 래퍼객체가 임시 승인을 해제합니다.
  5. 그래서 원시형의 원래 타입은 변하지 않습니다.