surf core js : 원시 래퍼 객체

자바스크립트는 원시값(문자열, 숫자 등)을 마치 객체처럼 다룰 수 있다.

즉, 원시값에도 객체에서처럼 메서드를 호출할 수 있다.

하지만, 원시값은 객체가 아니다.

원시형의 종류는 문자(string), 숫자(number), bigint, 불린(boolean), 심볼(symbol), null, undefined형으로 총 일곱 가지이다.

객체는 프로퍼티에 다양한 종류의 값(원시형, 객체, 함수 등)을 저장할 수 있다. (함수도 객체의 일종이지만 자바스크립트에선 아주 중요한 기능이니 따로 취급하겠다.)

하지만, 객체는 원시값보다 “무겁고”, 내부 구조를 유지하기 위해 추가 자원을 사용하는 단점이 존재한다.

원시값을 객체처럼 사용하기

자바스크립트 창안자(creator)는 다음과 같은 모순적인 상황을 해결해야만 했다.

문자열이나 숫자와 같은 원시값을 다루어야 하는 작업이 많은데, 메서드를 사용하면 작업을 수월하게 할 수 있을 것 같다는 생각이 들었다.

그런데 원시값은 가능한 한 빠르고 가벼워야 한다.

조금 어색해 보이지만, 자바스크립트 창안자는 아래와 같은 방법을 사용해 해결책을 모색했다.

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

각 래퍼 객체는 원시 자료형의 이름을 그대로 차용해, String, Number, Boolean, Symbol라고 부른다.

래퍼 객체 마다 제공하는 메서드 역시 다르다.

인수로 받은 문자열의 모든 글자를 대문자로 바꿔주는 메서드 str.toUpperCase()를 예로 들어보자.

let str = "Hello";

alert( str.toUpperCase() ); // HELLO

str.toUpperCase ()가 호출될 때 내부에서 실제로 동작하는 과정을 알아보자.

  1. 문자열 str은 원시값이므로 원시값의 프로퍼티(toUpperCase)에 접근하는 순간 특별한 객체가 만들어진다.

  2. 이 객체는 문자열의 값을 알고 있고, toUpperCase() 메서드를 가지고 있다.

  3. 메서드가 실행되고, 새로운 문자열이 반환된다.

  4. 특별한 객체는 파괴되고, 원시값 str만 남는다.

이런 내부 프로세스를 통해 원시값을 가볍게 유지하면서 메서드를 호출할 수 있는 것이다.

String/Number/Boolean를 생성자(new)로 호출하지 말자.

Java 등의 몇몇 언어에선 new Number(1) 또는 new Boolean(false)와 같은 문법을 사용해 원하는 타입의 "래퍼 객체"를 직접 만들 수 있다.

자바스크립트에서도 하위 호환성을 위해 이 기능을 남겨 두었는데, 이런 식으로 래퍼 객체를 만드는 건 추천하지 않는다.

alert( typeof 0 ); // "number"

alert( typeof new Number(0) ); // "object"!

let zero = new Number(0);

//객체는 논리 평가 시 항상 참을 반환하기 때문에 true
if (zero) {
  alert( "zero가 참이라는 것에 동의하시나요!?!" );
}

new를 붙이지 않고 String / Number / Boolean을 사용하는 건 괜찮다. new 없이 사용하면 상식에 맞게 인수를 원하는 형의 원시값(문자열, 숫자, 불린 값)으로 바꿔준다.

null/undefined는 메서드가 없다.

특수 자료형인 null과 undefined의 원시값(null/undefined)은 위와 같은 법칙을 따르지 않는다.

어떤 의미에서는 두 자료형이 "가장 원시적"이라 할 수 있다.

다음 편들은 유용히 사용될 다양한 메서드를 살펴보겠다.

Reference

좋은 웹페이지 즐겨찾기