자바스크립트에서 문자열, 숫자, 불리언 같은 원시 값(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() 직접 생성은 피해야 함 |
개발자 행동 | 대부분 경우, 자동 박싱에 의존하면 충분 |