자바스크립트에서 문자열, 숫자, 불리언 같은 원시 값(primitive value)도 객체처럼 메서드나 속성을 사용할 수 있는데,
그게 가능한 이유는 자바스크립트 엔진이 일시적으로 원시 값을 래퍼 객체로 변환하기 때문이다.
이때 생성되는 객체가 바로 래퍼 객체이다.
let str = "hello";
console.log(str.toUpperCase()); // "HELLO"
str.toUpperCase()를 호출하면,"hello"를 new String("hello")로 자동 박싱함.toUpperCase()가 호출됨| 원시 타입 | 래퍼 객체 | 생성 예시 |
|---|---|---|
string | String 객체 | new String("abc") |
number | Number 객체 | new Number(42) |
boolean | Boolean 객체 | new Boolean(true) |
이들은 전역 객체이며, 직접 인스턴스를 만들 수도 있다.
하지만, 직접 생성은 권장되지 않는다.
let x = new String("hello");
console.log(typeof x); // "object" ← 이제 더 이상 원시 타입 아님!
이렇게 만들면 비교 연산이나 타입 체크에서 예상치 못한 결과가 발생할 수 있다.
let a = "hello";
let b = new String("hello");
console.log(a === b); // false ← 타입 다름
원시 값이 메서드나 속성을 호출하면 엔진이 자동으로 래퍼 객체를 생성해서 처리하므로, 개발자가 명시적으로 래퍼 객체를 생성할 일은 거의 없다.
console.log("abc".length); // 3 ← 자동으로 String 객체로 래핑됨
| 항목 | Java | JavaScript |
|---|---|---|
| 원시 vs. 래퍼 타입 | int ↔ Integer, boolean ↔ Boolean | number ↔ Number, string ↔ String 등 |
| 박싱 | 명시적 or 자동 (autoboxing) | 자동 (메서드 호출 시 래퍼 객체 생성) |
| 지속성 | 명시적으로 생성되면 계속 존재 | JS에선 래핑 객체는 일시적이고 즉시 제거됨 |
| 비교 | ==는 값 비교, ===는 참조 비교 | JS에선 ===가 타입까지 비교 |
| 항목 | 설명 |
|---|---|
| 정의 | 원시 타입 값을 일시적으로 객체처럼 다루기 위한 내부 처리 |
| 작동 방식 | 메서드 호출 시 자동으로 래퍼 객체 생성 후 폐기 |
| 예시 클래스 | String, Number, Boolean |
| 주의사항 | new String(), new Number() 직접 생성은 피해야 함 |
| 개발자 행동 | 대부분 경우, 자동 박싱에 의존하면 충분 |