모던자바스크립트 내용을 참고하여 학습하였습니다.
모던자바스크립트
자바스크립트를 만든사람은 다음과 같은 모순적인 상황을 해결해야만 했다.
- 원시값을 다루어야 하는 작업이 많은데, 객체와 같이 메서드를 이용하면 편할것 같다.
- 원시값은 가벼운 형태가 아이덴티티인데, 객체로 사용하려니 너무 무겁다.
즉 원시타입의 데이터에 메서드를 사용하여 좀더 편의성을 높이고자 했다.
아래와 같은 방법을 사용해 해결책을 모새했다.
래퍼 객체(object wrapper)
를 만들어 준다.래퍼 객체
는 이름 그대로 원시값을 오브젝트처럼 다루기 위해 원시값을 랩(wrap)을한 객체다.
이 객체는 원시자료형의 이름을 그대로 이용하고 앞을 대문자로 바꾼
Number
, String
, Boolean
, Symbol
이라고 부른다. 각 래퍼 객체마다 제공되는 메서드(기능)이 다르다.
문자열 래퍼클래스인 String에서 입력받은 문자를 대문자로 바꿔주는
str.toUppserCase()를 예로 들어보자.
let str = 'hello'; console.log(str.toUpperCase()); // HELLO
- 문자열 str은 원시값이여서
.
을 사용하여 프로퍼티에 접근하려는 순간Wrapper Object
가 생성된다. 이 객체는 문자열의 값(hello)르 알고 있으며, 여러가지 문자열으 다룰수 있는 메서드를 가지고 있다.- 해당 메서드가 실행되고, 새로운 문자열이 반환된다.
- 메서드 호출이 끝나면 위에서 만들어진
Wrapper object
는 파괴되고 원시데이터인 str만 남게된다.
위와 같은 프로세스를 통하여 원시값을 가볍게 유지하며 메서드를 호출할 수 있게되었다.
숫자형이나 문자형등 각 데이터타입에 존재하는 메서드로 데이터들을 편하게 핸들링할 수 있다.
자바를 배울때도 래퍼 클래스라는게 존재했다.
primitive type의 데이터를 객체처럼 사용하기위해 wrapper class를 이용해 오브젝트를 만들어 사용했다.
자바에선 new
키워드를 이용해서 객체를 직접 만들수 있었다.
하지만 자바스크립트에서는 이런식으로 래퍼 객체를 만드는 건 추천하지 않는다. 그 이유는 몇몇 상황에서 혼동을 야기하기 때문이다.
console.log( typeof 0 ); // 'number'
console.log( typeof new Number(0) ); // "object"
위처럼 래퍼객체를 new키워드를 통해 직접 만들어 데이터를 할당한다면 이것은 명시적인 객체가 되어버린다.
래퍼 객체는 원시값을 가볍게 유지하며 사용하기 위함이기 때문에 의도적으로 만들어 사용하는것은 필요하지않는이상 추천되지 않는다.
또한, 트루시한값과 펄시한값을 구분하는데에 있어 원치 않는 결과를 도출한다.
if(0) { // 0은 펄시한 값이라 false로 조건을 판단
...
}
let numObj = new Number(0);
if(numObj) { // 오브젝트는 논리 평가시 항상 참을 반환한다.
...
}
위와 같은 여러가지 상황 때문에 new
를 이용한 객체는 권장하지 않는다.
하지만 new
를 사용하지않고 그냥 Number(str)
처럼 묶어주는것은 안의 인자를 숫자형 원시타입으로 만들어 주기만 하기 때문에 아주 유용하다.
결론만 말하면 없다
래퍼 객체
도 없으며 메서드
도 제공하지 않는다.
이렇게만 본다면 두 자료형이 가장 원시적
이라 볼 수 있지않을까..?