래퍼 객체(Wrapper Object)

래퍼 객체(Wrapper Object)

<래퍼 객체의 원리>

자바스크립트에서 다루는 원시 데이터 타입들은 마치 객체처럼 프로퍼티나 메소드의 방식으로 다룰 수 있다.

실제 VSCode와 같은 IDE에서도 자동완성의 형식으로 이를 지원한다.

String 데이터 타입의 메서드

"good morning".toUpperCase(); // "GOOD MORNING"

이것이 가능한 이유는 프로그램이 문자열의 프로퍼티를 참조하거나 메소드로 접근을 하면 자바스크립트는 new String("good morning")을 호출한 것처럼 string 데이터 타입을 래퍼 객체로 임시로 변환하기 때문이다.

즉, 원시 타입들이 불러오는 프로퍼티나 메서드들은 사실 전역 빌트인 객체에 허용된 것들인데, 자바스크립트는 일시적으로 래퍼 객체를 생성하여 이를 원시 타입들이 활용할 수 있게 해준다.

원시 타입의 메서드 호출 → 원시 타입에 해당하는 래퍼 객체 생성 → 래퍼 객체의 메서드 호출 → 메서드 처리

→ 래퍼 객체 소멸 → 원시 타입만 잔류

더 정확한 코드는 다음과 같다. 예시에서는 배열과 비슷한 형태를 가지는 string 데이터 타입을 활용하였다.

let str = "hello"; a.firstProperty = 111; // new String(str).firstProperty = 111 a.firstProperty; // undefined

보는 것과 같이, 원시 데이터 타입의 프로퍼티에 일시적으로 래퍼 객체가 생성되었다가, 해당 코드가 종료되는 즉시 소멸한다. 따라서 코드의 마지막 줄은 undefined가 출력된다.

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

래퍼 객체도 어쨋든 객체이기 때문에, 형태상 동일하더라도 자기 자신이 아니면 동일하다가 간주하지 않는다.

<래퍼 객체의 존재 의의>

원시 데이터 타입은 많은 정보를 담고 있지 않다. 따라서 프로퍼티는 물론이고 간단한 메서드를 실행하는 것도 추가적인 작업 없이는 불가능한 경우가 많다.

반대로 객체는 메모리 상 원시 타입보다 훨씬 무겁고 느리다. 그만큼 많은 정보를 담고 있어서, 프로퍼티나 메서드 호출도 자유롭다.

따라서 가볍고 처리가 빠른 원시 데이터 타입을 유지하되, 사용자의 의도나 편의성을 위해 프로퍼티, 메서드를 호출할 때만 잠깐 객체로 바꿔주는 것이 바로 래퍼 객체라고 할 수 있다.

from http://oaat9309.tistory.com/29 by ccl(A) rewrite - 2021-11-04 17:27:41