모던 자바스크립트 Deep Dive 11장

seokji·2022년 10월 7일
0

DeepDive

목록 보기
5/6
post-thumbnail

11장 원시 값과 객체의 비교


개요

원시 타입과 객체 타입은 크게 세 가지 측면에서 다르다.

  1. 원시 값immutable value(변경 불가능한 값)이고 객체mutable value(변경 가능한 값)이다.
  2. 원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에는 실제 값이 저장된다. 객체를 변수에 할당하면 변수(확보된 메모리 공간)에는 참조 값이 저장된다.
  3. 원시 값은 복사되어 전달되는데 이를 값에 의한 전달이라 한다. 객체는 참조 값이 복사되어 전달되는데 이를 참조에 의한 전달이라 한다.

11.1 원시 값

변경 불가능한 값

원시 타입의 값, 원시 값변경 불가능한 값(immutable value) 이다.

즉 생성된 원시 값은 읽기 전용으로 변경할 수 없다.

변수는 하나의 값을 저장하기 위해 확보한 메모리 공간(이름)이고, 값은 변수에 저장된 데이터로서 표현식의 평가 결과를 말한다.

변경 불가능하다는 것은 변수에 해당하는 것이 아닌, 값에 해당한다.

✨ 원시 값의 특성은 데이터의 신뢰성을 보장한다.

불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없다.

값에 의한 전달

변수에 원시 값을 갖는 변수를 할당하면 할당받는 변수에는 할당되는 변수의 원시 값이 복사되어 전달된다. 이를 값에 의한 전달이라고 한다.

var score = 80;

// copy 변수에는 score 변수의 값 80이 복사되어 할당된다.
var copy = score;

console.log(score, copy); // 80, 80
console.log(score === copy); // true

score 변수와 copy 변수의 값 80은 다른 메모리 공간에 저장된 별개의 값이다.

var score = 80;

// copy 변수에는 score 변수의 값 80이 복사되어 할당된다.
var copy = score;

score = 100;

console.log(score, copy); // 100, 80
console.log(score === copy); // false

다른 메모리 공간에 저장된 별개의 값이기 때문에, 복사된 값에는 영향을 주지 않는다.


11.2 객체

객체는 프로퍼티의 개수가 정해져 있지 않으며, 동적으로 추가되고 삭제할 수 있다. 프로퍼티 값에 제약도 없다. 객체를 관리하는 방식은 원시 값과 비교해서 복잡하다.

변경 가능한 값

객체 타입의 값, 객체는 변경 가능한 값(mutable value) 이다.

객체를 할당한 변수가 메모리 주소를 통해 메모리 공간에 접근하면 참조 값에 접근할 수 있다.

참조 값은 생성된 객체가 저장된 메모리 공간의 주소, 그 자체다.
객체를 할당한 변수를 참조하면 메모리에 저장되어 있는 참조 값을 통해 실제 객체에 접근한다.

객체를 할당한 변수는 재할당 없이 객체를 직접 변경할 수 있다.

✨ 메모리를 효율적으로 사용하기 위해, 객체는 변경 가능한 값으로 설계되었다.

이런 구조의 부작용도 있는데, 여러 개의 식별자가 하나의 객체를 공유할 수 있다는 것이다.

✨ 얕은 복사 : 한 단계까지만 복사하는 것을 말하고, 깊은 복사: 객체에 중첩되어 있는 객체까지 모두 복사하는 것을 말한다.

참조에 의한 전달

여러 개의 식별자가 하나의 객체를 공유할 수 있다는 것이 무엇을 의미하는 지 알아보자.

var person = {
  name: "Yu",
};

// 참조 값을 복사(얕은 복사)
var copy = person;

객체를 가리키는 변수(원본)를 다른 변수(사본)에 할당하면 원본의 참조 값이 복사되어 전달된다. 이를 참조에 의한 전달이라한다.

저장된 메모리 주소는 다르지만 동일한 참조 값을 갖는다. 다시 말해 동일한 객체를 가리킨다.
이는 두 개의 식별자가 하나의 객체를 공유하는 것을 의미한다.

var person = {
  name: "Yu",
};

var copy = person;

copy.name = "Ji";

// 두 개의 식별자가 하나의 객체를 공유
console.log(person); // { name: 'Ji' }
console.log(copy); // { name: 'Ji' }

위 예제와 같이 두 개의 식별자가 하나의 객체를 공유하는 경우 원본 또는 사본의 프로퍼티를 변경할 시 서로 영향을 준다.


✔ 배운점

객체는 원시 값과 다르게 왜 참조 값을 갖고 변경 가능한 값인지 궁금했는데, 궁금증이 해소 된 것 같다.

객체는 원시 값에 비해 메모리도 크고 관리 부분에서 금전적인 부분도 더 들기 때문에 변경이 가능 하다고 한다.

0개의 댓글