자바스크립트 패턴 — 3.1 원시형
4분 읽기
- ES5 기준 원시형은 5가지입니다. (
String,Number,null,undefined,Boolean) - ES6부터
Symbol이 추가되어 원시형은 6가지가 되었습니다. - 객체가 아님에도 원시형이 프로퍼티를 사용할 수 있는 이유는 JavaScript에 래퍼객체가 존재하기 때문입니다.
- 래퍼객체는
String,Number,Boolean(ES6에서는Symbol까지 포함)의 프로퍼티에 접근할 때 발생하는 임시 객체입니다.
- 래퍼객체는
- 한 번 이상 참조할 상수는 변수에 담아두고, 변수를 대신 참조하는 것이 좋습니다.
이해되지 않는 내용 — SOLID와 원시형
단일 책임 원칙
모든 클래스(자바스크립트의 경우 함수)는 반드시 한 가지 변경 사유가 있어야 한다.
책에서는 "원시형은 일편단심이다"라고 표현합니다. 이 말의 의미는 다음 둘 중 어느 것일까요?
- 원시형은 한 가지 이유로만 변한다.
- 원시형은 불변이다.
개방/폐쇄 원칙
모든 소프트웨어 개체는 실행 코드를 변경하지 말고, 재사용하고 확장해야 한다.
책에서는 "원시형은 불변값이다"라고 합니다. 하지만 실무에서는 값을 변경하는 것처럼 보이는데, 왜 불변이라고 하는지 의문이 들었습니다.
용어 정리
래퍼객체 (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와 동일한 값을 갖고 있었지만, 이후 새로운 프로퍼티를 추가하고 그 값을 참조하려 할 때는 적용되지 않았습니다.
이렇듯 래퍼객체를 가비지 컬렉션 대상이라 일컫는 이유는, 래퍼객체는 원시형이 값을 참조하고 도움을 얻으려 할 때만 잠시 나타날 뿐 지속성이 없기 때문입니다.
요약하면 래퍼객체의 동작 방식은 다음과 같습니다.
- 원시형(
String,Number,Boolean,Symbol)이 객체들만 접근할 수 있는 프로퍼티에 접근을 원합니다. - 래퍼객체가 해당 원시형에게 일시적으로 객체 자격을 임시 부여합니다.
- 원시형이 해당 프로퍼티를 확인합니다.
- 확인이 끝나면 래퍼객체가 임시 승인을 해제합니다.
- 그래서 원시형의 원래 타입은 변하지 않습니다.