[javaScript] 래퍼객체(Wrapper object)
래퍼객체 (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 객체는 개별 객체이기 때문에 오로지 자기자신과만 동일합니다.