26. 원시값의 메서드. 임시 객체?
2026년 4월 14일
1. 개요: 원시값의 역설 (The Paradox)
프로그래밍을 하다 보면 두 가지 상충하는 니즈가 생깁니다.
- 가벼움: 문자열이나 숫자는 엄청나게 많이 쓰이므로 가볍고 빨라야 합니다.
- 강력함: 문자열의 길이를 재거나 대문자로 바꾸는 등의 편리한 기능(메서드)이 필요합니다.
자바스크립트 설계자는 이를 위해 **"평소에는 원시값으로 살다가, 메서드를 호출할 때만 잠깐 객체로 변신한다"**는 기발한 아이디어를 도입했습니다.
2. 원시 래퍼 객체의 동작 원리
원시값의 메서드를 호출하면 엔진 내부에서 소리 소문 없이 다음과 같은 프로세스가 진행됩니다.
🎭 "메서드 호출 시 일어나는 3단계 마술"
- 변신: 원시값에 프로퍼티(메서드)를 요청하면, 해당 타입에 맞는 **특수한 객체(Wrapper)**가 임시로 생성됩니다.
- 수행: 이 객체는 문자열이면
toUpperCase(), 숫자면toFixed()같은 유용한 기능을 이미 알고 있고, 이를 실행합니다. - 소멸: 메서드 실행이 끝나면 이 임시 객체는 즉시 파괴되고, 다시 순수한 원시값만 남습니다.
let str = "hello"; alert( str.toUpperCase() ); // "HELLO"
💡 핵심 요약: 메서드를 호출하는 그 찰나에만 잠시 '객체인 척' 했다가 다시 원시값으로 돌아가는 것입니다. 자바스크립트 엔진은 이 과정을 매우 고도로 최적화하여 성능 손실을 거의 없게 만듭니다.
3. 래퍼 객체의 종류
자료형마다 전용 래퍼 객체가 존재합니다.
String: 문자열 메서드 (toUpperCase,indexOf등) 제공Number: 숫자 메서드 (toFixed,toPrecision등) 제공Boolean: 논리형 관련 기능 제공Symbol: 심볼 관련 기능 제공
⚠️ 주의: 생성자로는 쓰지 마세요!
new Number(1) 처럼 직접 객체를 만드는 것은 자바스크립트 역사 속의 실수로 취급됩니다. typeof를 찍으면 object가 나오기 때문에 조건문 등에서 엉뚱하게 동작할 수 있습니다.
- 올바른 예:
let num = Number("123");(new 없이 사용하면 단순 형 변환을 수행하여 안전합니다.)
4. null과 undefined의 예외성
이 두 친구들은 이름 그대로 "가장 원시적인" 상태입니다.
- 연관된 래퍼 객체가 없습니다.
- 메서드도 당연히 제공하지 않습니다.
- 접근하려 하면? 바로 에러(
TypeError)가 발생하며 스크립트가 멈춥니다.
🎙️ 기술 면접 대비 (Interview Questions)
Q1. 원시값에 프로퍼티를 동적으로 추가하면 어떻게 되나요? (중급)
답변: 비 엄격 모드에서는 에러가 나지 않지만, 추가한 프로퍼티가 즉시 사라집니다. 프로퍼티를 추가하려 할 때 임시 래퍼 객체가 생성되어 거기에 저장되지만, 그 라인이 끝나는 순간 래퍼 객체가 파괴되기 때문입니다. 엄격 모드(
'use strict')에서는 원시값에 수정을 시도하는 즉시 에러가 발생합니다.
Q2. 원시 래퍼 객체가 성능에 악영향을 주지는 않나요? (심화)
답변: 명세상으로는 객체를 매번 만드는 것처럼 설명되어 있지만, 실제 모던 자바스크립트 엔진(V8 등)은 객체를 진짜로 생성하지 않고도 같은 결과가 나오도록 고도로 최적화되어 있습니다. 따라서 개발자는 성능 걱정 없이 원시값의 메서드를 편하게 사용해도 됩니다.
📝 과제 리뷰: str.test = 5는 왜 안 될까?
아래 코드를 실행해 보세요.
let str = "Hello"; str.test = 5; // (*) alert(str.test);
엄격 모드인지 아닌지에 따라 결과가 나뉩니다.
undefined(비 엄격 모드)- An error (엄격 모드)
(*)로 표시한 줄에서 무슨 일이 일어나는지 알아보면서, 왜 위와 같은 결과가 나타나는지 이해해 봅시다.
str의 프로퍼티에 접근하려 하면 "래퍼 객체"가 만들어집니다.- 엄격 모드에선 래퍼 객체를 수정하려 할 때 에러가 발생합니다.
- 비 엄격 모드에선 에러가 발생하지 않습니다. 래퍼 객체에 프로퍼티
test가 추가되죠. 그런데 래퍼 객체는 바로 삭제되기 때문에 마지막 줄이 실행될 땐 프로퍼티test를 찾을 수 없습니다.
위 예시를 통해 원시값과 객체는 다르다는 것을 다시 한번 확인해 보았습니다.
원시값은 추가 데이터를 저장할 수 없습니다.
str.test = 5시점에 래퍼 객체 1번이 생겨서 5를 저장함.- 저장 직후 래퍼 객체 1번 사망.
alert(str.test)시점에 래퍼 객체 2번이 새로 태어남.- 새로 태어난 래퍼 객체 2번은 당연히
test라는 프로퍼티가 없으니undefined출력!