래퍼 객체(Wrapper Objects)
- JS는 원시 데이터 유형과 그에 대응하는 래퍼 객체가 존재함.
- 원시 데이터는 값 자체를 말하며, 래퍼 객체는 이러한 값을 객체로 랩핑함.
- 객체 안에는 여러 메서드와 프로퍼티가 존재.
- Number, String, Boolean 등 래퍼 객체 존재.
.valueOf()
메서드를 이용하면 래퍼 객체가 래핑한 원시 데이터 값을 반환.
String 래퍼 객체
const strObj = new String("World");
console.log(strObj);
console.log(typeof strObj);
console.log(typeof strObj.valueOf());
주요 메서드와 프로퍼티
String.prototype.charAt()
: 주어진 인덱스에 해당하는 문자를 반환.
String.prototype.toUpperCase()
: 문자열을 모두 대문자로 변환한 새로운 문자열을 반환.
String.prototype.toLowerCase()
: 문자열을 모두 소문자로 변환한 새로운 문자열을 반환.
String.prototype.concat()
: 문자열과 하나 이상의 문자열을 합쳐 새로운 문자열을 반환.
String.length
: 문자열의 길이를 나타내는 프로퍼티.
Number 래퍼 객체
const numObj = new Number(7);
console.log(numObj);
console.log(typeof numObj);
console.log(typeof numObj.valueOf());
주요 메서드와 프로퍼티
Number.prototype.toFixed()
: 소수점 이하 자릿수를 제한한 문자열로 변환한 후 반환.
Number.prototype.toPrecision()
: 지정된 숫자의 유효 숫자 자릿수를 가지는 문자열로 변환한 후 반환.
Number.prototype.toString()
: 주어진 진수에 따라 숫자를 문자열로 변환한 후 반환.
isNaN()
: 숫자가 NaN(Not-a-Number)인지 여부를 나타내는 부울 값을 반환.
Boolean 래퍼 객체
const boolObj = new Boolean(false);
console.log(boolObj);
console.log(typeof boolObj);
console.log(typeof boolObj.valueOf());
자동 형 변환 (Type Coercion)
- JS는 동적 타입 언어로, 데이터 유형 간에 자동 형 변환이 수행되는 언어.
- 데이터 유형 간의 자동 형 변환이 필요한 경우에 자동으로 수행함.
- 문자열과 숫자의 자동 형 변환
const num = 42;
const str = "3";
const result = num + str;
console.log(result);
const isTrue = true;
const num = 7;
const result = isTrue + num;
console.log(result);
const str = "true";
const isTrue = true;
const result = (str === isTrue);
console.log(result);
- 자동 형 변환은 JavaScript의 유연성을 제공하지만, 예상치 못한 결과를 초래할 수 있으므로 주의가 필요하며, 정적 타입 시스템을 제공하는 TypeScript를 이용하는 추세.
원시 값을 래퍼 객체로 자동 형 변환
- 원시 값은 래퍼 객체로 자동 형 변환 되기 때문에 프로퍼티와 메서드를 모두 사용할 수 있음.
- 문자열
const str = "Hello";
const strLength = str.length;
console.log(strLength);
const num = 42;
const numValue = numObj.valueOf();
console.log(numValue);
- 형변환 과정
- Boxing : 원시 값을 래퍼 객체(메서드, 프로퍼티)로 사용하려 할 때, JS 엔진은 해당 원시 값을 래퍼 객체로 "Boxing" 하여 임시 객체 생성.
- 작업 수행 : 임시 객체에 존재하는 해당 메서드(or 프로퍼티)를 호출하여 작업을 수행하고 결과를 반환.
- 제거 : 임시 객체가 해당 스코프에서 사용이 완료되면 JS 엔진의 가비지 컬렉터(Garbage Collector)에 의해 파기.
원시 값과 래퍼 객체
- 자동 형 변환으로 원시 값도 래퍼 객체처럼 이용이 가능함.
- 래퍼 객체를 사용하면 성능 및 가독성 이슈가 발생할 수 있음.
- 원시 데이터 유형을 직접 사용하는 것이 일반적으로 더 효율적.
- 원시 값은 해당 데이터 유형의 메서드와 프로퍼티을 가지고 있지 않음.
- 원시 값은 불변이며, 래퍼 객체는 변이성을 가지는데,
- 래퍼 객체의 원시 값을 직접 변경하는 것을 의미하는 것은 아님.