원시타입 vs 객체타입
1. 저장된 값
원시타입과 객체타입은 메모리에 저장되는 값이 다릅니다. 원시타입은 실제 값을 저장하고, 객체타입은 참조 값을 저장합니다. 원시타입은 변수에 연결된 주소에 실제 값이 저장되어 있습니다.
let name = 'weniv';
let name = 'weniv';
객체타입은 실제 값이 저장되어 있는 위치의 주소, 즉 참조 값을 저장합니다.
const user = {
age: 30,
name: 'licat',
};
const user = {
age: 30,
name: 'licat',
};
2. 값에 의한 전달
원시 타입과 객체 타입은 변수에 할당하거나 함수에 인자로 전달할 때 다르게 동작합니다.
2.1 원시 타입의 값 전달
원시 타입의 경우, 변수를 다른 변수에 할당하면 값이 복사되어 전달됩니다. 이를 '값에 의한 전달'이라고 합니다. 다음 예제에서 b의 값을 변경해도 a의 값은 영향을 받지 않습니다.
2.2 객체 타입의 참조 전달
객체 타입의 경우 변수에 할당하면 참조 값이 복사되어 전달됩니다. 이를 '참조에 의한 전달'이라고도 하지만, 실제로는 저장되어 있떤 참조 값이 복사되어 전달되는 것이므로 '값에 의한 전달'이라고 볼 수 있습니다. 다음 예제에서 obj1
과 obj
는 같은 객체를 참조하고 있기 때문에, obj2
객체의 속성을 변경하면 obj1
객체도 영향을 받습니다. 하지만 obj2
에 다른 객체를 할당하면 obj1
에는 영향을 주지 않습니다.
3. 원시 래퍼 타입
메서드는 객체 타입의 값에서 사용 가능한 기능을 제공합니다. 하지만 원시 타입의 값에서도 메서드를 사용할 수 있습니다. 이는 자바스크립트 엔진이 원시 타입의 값을 객체로 변환하여 메서드를 사용할 수 있게끔 처리하기 때문입니다.
위 코드는 실제로 아래와 같이 동작합니다. 일시적으로 문자열 객체를 만들고 이 객체에 있는 메서드를 호출한 뒤, 객체를 제거합니다. 이처럼 원시타입을 마치 객체 타입처럼 사용할 수 있게 하는 것을 '원시 래퍼 타입'이라고 합니다.
let temp = new String('hello!');
console.log(temp.toUpperCase());
temp = null;
let temp = new String('hello!');
console.log(temp.toUpperCase());
temp = null;
이 과정을 거치는 이유는 원시타입도 객체타입처럼 다양한 메서드를 사용할 수 있게 함으로써 일관적인 사용 경험을 제공하기 위함입니다.