원시값과 객체의 비교

정지훈·2020년 11월 24일
0

데이터 타입에서 살펴보았듯이 자바스크립트가 제공하는 7가지 데이터 타입은 크게 원시 타입 객체 타입으로 구분할 수 있다.

원시타입의 값은 변경 불가능한 값이다 이에 비해 객체 타입의 값은 변경 가능한 값이다.

원시값을 변수에 할당하면 변수(메모리 공간)에는 실제 값이 저장된다. 이에 비해 객체를 변수에 할당하면 변수에는 참조값이 저장된다.

원시값을 갖는 변수를 다른 변수에 할당하면 원본의 원시값이 복사되어 전달된다. 이를 값에 의한 전달이라 하고 이에 비해 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조값이 복사되어 전달된다. 이를 참조에 의한 전달이라 한다,.

이렇게 말로 설명하는 것 보다 아래 코드를 보자

let a = 30;
let copy = a;
copy = 10;
console.log(a) // ?

a는 30이 찍힐 것이다. 즉 값에 의한 전달이다. 즉 메모리에 있는 a 식별자의 메모리 공간은 변하지 않고 값을 전달해 새로운 메모리에 copy에게 전달한 것이다.

참조에 의한 전달을 보자.

let obj = {
  a: 30
}

let copy = obj;

copy.a = 50

console.log(obj) // ?

obj는 그대로일까? 아니다 copy를 해도 객체는 가변하다. obj { a: 50} 값이 변해 있을 것 이다.

즉 객체는 여러 값을 저장할 수 있기 때문에 메모리 공간이 커야 한다. 이것을 복사해서 다른 메모리에 저장하면 효율적이지 않아서 변수에 객체를 할당하면 메모리의 선두 어드레스가 참조값으로 들어가서 복사를 할때 같은 메모리 주소를 가리키게 된다. 그래서 복사를 해도 원본인 객체를 건들기 때문에 객체는 가변하다고 한다.

즉 우리가 객체를 이용할때 불변성을 지키기 위해 깊은 복사를 해서 사용하는 것이 좋다.

좋은 라이브러리를 사용해서 이용하는 것이 가장 좋은 방법이다.

0개의 댓글