본문 바로가기
자바스크립트 Deep Dive

[Javascript] 원시 타입 vs 객체 타입 메모리 사용법 비교

by 준생님 2023. 2. 12.

자바스크립트에서 원시 타입(number, string, boolean, null, undefined, symbol) 을 말한다.

이외의 모든 값은 객체 타입의 값이다.

 

두 타입의 차이점은 다음과 같다.

1.

원시값은 메모리에 직접 값이 들어가고,

객체 타입은 참조하고있는 메모리 주소 값이 들어간다.

2.

원시 타입은 값이 변경 불가(immutable)하고

객체 타입은 값이 변경 가능하다.

(값이 변경 불가하다는 것이지 재할당은 가능하다.)

 

먼저 객체 타입은 immutable하지 않고 값을 변경 가능하기에 갖는 장단점이 있다.

장점 : 깊은 복사를 하지 않아 메모리를 덜 사용한다.

단점 : 데이터 신뢰성이 낮다.

var person1 = {
    name: 'Choi'
}
person2 = person1;

위코드는 아래처럼 메모리 할당이 이루어진다.

같은 객체를 참조하고 있는 식별자가 있을 때 데이터 신뢰성 문제가 발생한다. 

 

person2.age = '30''; 라는 코드를 작성하여

객체에 새로운 프로퍼티를 추가한다면

객체는 다음과 같이 값을 직접 변경해버린다. 

var person1 = {
    name: 'Choi'
}
person2 = person1;
person2.age = '30';

console.log(person1); // { name: 'Choi', age: '30' }

따라서 개발자의 의도와는 다르게 person1에 대한 값도 바뀌어버릴 수 있다.

이런 의미에서 객체는 값에 대해 immutable하지 않기에 데이터 신뢰성이 낮다.

 

그에 반해 원시값은 immutable하여 값을 변경할 수 없다.

var person1 = 'Choi';
person2 = person1;
person2 = 'Lee';

console.log(person1); //Choi
console.log(person2); //Lee

어떤 상황에서도 값이 직접 변경되지 않기에 데이터 신뢰성이 높다.

하지만 매번 깊은 복사를 진행하고 메모리를 직접 해제하지 못하고 GC를 통해 진행하기에

메모리를 효율적으로 사용하진 못한다.

 

* 객체는 경우에 따라 데이터가 많이 클 수 있기에 메모리 효율을 위해 immutability를 포기하였음.