26. 원시값의 메서드

Chipmunk_jeong·2021년 3월 3일
0

TIL

목록 보기
26/62
post-thumbnail

모던자바스크립트 내용을 참고하여 학습하였습니다.
모던자바스크립트

원시값을 객체처럼?

자바스크립트를 만든사람은 다음과 같은 모순적인 상황을 해결해야만 했다.

  • 원시값을 다루어야 하는 작업이 많은데, 객체와 같이 메서드를 이용하면 편할것 같다.
  • 원시값은 가벼운 형태가 아이덴티티인데, 객체로 사용하려니 너무 무겁다.

즉 원시타입의 데이터에 메서드를 사용하여 좀더 편의성을 높이고자 했다.
아래와 같은 방법을 사용해 해결책을 모새했다.

  • 원시값은 원시값 그대로 남겨둬 단일 값 형태를 유지
  • 문자열, 숫자, 불린, 심볼의 메서드와 프로퍼티에 접근할 수 있도록 언어 차원에서 허용
  • 원시값임 ㅔ서드나 프로퍼ㅣ에 접근하려 하면 추가 기능을 제공해주는 특수한 객체 래퍼 객체(object wrapper)를 만들어 준다.

래퍼 객체는 이름 그대로 원시값을 오브젝트처럼 다루기 위해 원시값을 랩(wrap)을한 객체다.

이 객체는 원시자료형의 이름을 그대로 이용하고 앞을 대문자로 바꾼
Number, String, Boolean, Symbol이라고 부른다. 각 래퍼 객체마다 제공되는 메서드(기능)이 다르다.

문자열 래퍼클래스인 String에서 입력받은 문자를 대문자로 바꿔주는
str.toUppserCase()를 예로 들어보자.

let str = 'hello';
console.log(str.toUpperCase()); // HELLO
  1. 문자열 str은 원시값이여서 .을 사용하여 프로퍼티에 접근하려는 순간 Wrapper Object가 생성된다. 이 객체는 문자열의 값(hello)르 알고 있으며, 여러가지 문자열으 다룰수 있는 메서드를 가지고 있다.
  2. 해당 메서드가 실행되고, 새로운 문자열이 반환된다.
  3. 메서드 호출이 끝나면 위에서 만들어진 Wrapper object는 파괴되고 원시데이터인 str만 남게된다.

위와 같은 프로세스를 통하여 원시값을 가볍게 유지하며 메서드를 호출할 수 있게되었다.
숫자형이나 문자형등 각 데이터타입에 존재하는 메서드로 데이터들을 편하게 핸들링할 수 있다.

Wrapper object도 생성자?

자바를 배울때도 래퍼 클래스라는게 존재했다.
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)처럼 묶어주는것은 안의 인자를 숫자형 원시타입으로 만들어 주기만 하기 때문에 아주 유용하다.

null/undefined도 래퍼 객체가 있을까?

결론만 말하면 없다
래퍼 객체도 없으며 메서드도 제공하지 않는다.
이렇게만 본다면 두 자료형이 가장 원시적이라 볼 수 있지않을까..?

profile
Web Developer

0개의 댓글