JavaScript

[javaScript] 래퍼객체(Wrapper object)

유병각 2021. 8. 12. 01:36

래퍼객체 (Wrapper object)

 

1. 원시 타입과 래퍼객체

자바스크립트에는 총 6가지의 원시 타입이 있습니다.

string, number, boolean, null, undefined, symbol

또한 이 원시타입에 대응하는 래퍼객체 4가지가 존재합니다.

String, Number, Boolean, Symbol

래퍼라는 이름에서 알 수 있듯이, 래퍼객체는 원시타입을 감싸는 형태로 사용됩니다.

"hello".toUpperCase(); // result : HELLO

위 코드를 보면 hello 는 원시타입인 string 자료형임에도 불구하고 toUpperCase() 라는 메소드를 가지고 있음을 알 수 있습니다. 

어떻게 이게 가능한걸까요?

 

프로그램이 문자열 hello 의 프로퍼티를 참조하려고 하면, javaScript 는 new String("hello") 를 호출한 것처럼 string 자료형을 임시적으로 래퍼객체로 변환하기 때문입니다. 

이렇게 생성된 임시 래퍼객체는 참조가 끝나면 사라지게 되는데, 아래 코드를 통해 확인 할 수 있습니다. 

let a = 'hello';
a.someProperty = 100; // new String(a).someProperty = 100;
console.log(a.someProperty) // undefined

a 라는 string 타입 변수에 속성값으로 someProperty 라는 값에 100을 대입했지만, 다시 꺼냈을 때 출력되는건 undefined 이며, 래퍼 객체가 소멸했음을 알 수 있습니다. 

 

결국 실제로는 원시값에 프로퍼티를 설정할 수 없다는 건데 (엄밀히 말하자면 설정 자체는 가능하지만, 이내 사라져버리므로 설정의 의미가 없음), 이런 동작을 이해하는 것은 자바스크립트를 한 층 더 깊숙히 알게해줍니다.

 

2.  원시타입과 객체의 차이점

var s1 = "hello";
var s2 = new String("hello");
var s3 = new String("hello");
 
typeof s1;    // "string"
typeof s2;    // "object"
 
s1 == s2;    // false
s2 == s3;    // false

위 코드에서 알 수 있듯이, 원시타입의 문자열인 s1 과 다르게 s2, s3 은 객체입니다.

그렇기 때문에 원시타입 string 과 객체 string 은 동일하지 않습니다.

 

하지만 같은 string 객체라도 동일하지 않을 수 있는데, String 객체는 개별 객체이기 때문에 오로지 자기자신과만 동일합니다.