Javascript:wrapper

Hanaotome wiki

Javascript의 래퍼 객체(wrapper object)는 문자열, 숫자, 불리언 같은 리터럴 타입의 일부에 대한 프로퍼티(Property)에 접근하려고 할 때 생성되는 임시 객체이다.

설명

래퍼 객체는 객체가 아닌 리터럴 타입에 대해(String, Number, Boolean) 프로퍼티를 호출할 경우, 해당 원시 타입이 변환되어진 객체를 의미한다. 이렇게 생성된 래퍼 객체는 prototype[1]으로 해당 리터럴 타입의 메소드를 가지며, 사용이 끝나고 프로퍼티 참조가 해제되면 해당 래퍼 객체는 메모리에서 회수된다[2]. 하지만 이 래퍼 객체의 프로퍼티에는 값을 할당할 수는 없는데, 이는 해당 프로퍼티의 처리가 끝나는 순간 래퍼 객체는 사라지고 그 밑에서 참조할 경우 다시 생성되기 때문이다. String()Number(), Boolean() 생성자를 통해서 명시적으로 래퍼 객체를 생성할 수는 있으나. 이는 불필요한 일이다.

예시

아래 예시를 보자

1 var s = 'hello world';
2 var word = s.substring(s.indexOf(" ") + 1, s.length);
3 console.log(word); // world

원래대로라면 s는 리터럴 문자열을 참조하고 있으므로, 어떠한 프로퍼티나 메서드도 가지고 있지 않다. 하지만 substring이라는 메서드를 호출할 수 있는데, 이는 래퍼 객체가 호출되면서 new String(s)와 같은 동작을 하기 때문이다.

이는 Number 혹은 Boolean의 리터럴 문자열에도 같은 동작을 한다.

1 var n = 10.0
2 var b = true
3 b.length //Boolean(b).length
4 n.MAX_VALUE // Number(n).MAX_VALUE

래퍼 객체의 read-only

래퍼 객체는 read-only로써, 해당 객체에는 값을 할당할 수가 없다. 해당 예시를 보자.

1 var s = 'test';
2 s.len = 4;
3 var t = s.len; //undefined

예시의 2번 라인을 보면, 래퍼 객체 slen이라는 프로퍼티 안에 4라는 값을 집어넣었으나. 3번 라인에서 이를 참조할 경우 undefined가 된다. 2번 라인에서 프로퍼티 참조가 끝나고 할당된 래퍼 객체는 해제된다, 그리고 3번 라인에서 다시 래퍼 객체가 생성되고 이를 참조하게 된다. 이 때 새로 생성된 래퍼 객체에는 len 프로퍼티가 존재하지 않으므로 undefined가 리턴된다. 따라서 래퍼 객체는 read-only라고 볼 수 있으며, 이런 특성 때문에 원시 타입을 참조하고 있는 변수의 값을 직접 수정하는 것은 불가능하다.

1 var s = 'hello';
2 s.toUppserCase(); // HELLO
3 s //hello


각주

  1. [1], https://wiki.hanaoto.me/wiki/Javascript:prototype
  2. 자바스크립트 인터프리터는 실제로는 생성 후 회수하지는 않지만, 회수하는 것 처럼 동작하여야 한다.