[Deep dive] 11. 원시 값과 객체의 비교

정호·2023년 3월 28일
2

원시 타입 vs 객체 타입

원시 타입객체 타입
변경 불가능 한 값변경 가능한 값
메모리 공간실제 값 저장참조 값 저장
변수에 재할당값에 의한 전달참조에 의한 전달

원시 값

1️⃣ 변경 불가능한 값

원시타입의 값은 변경 불가능한 읽기 전용 값이다. 그렇기 때문에 데이터의 신뢰성을 보장한다는 장점이 있다.

원시 값을 할당한 변수에 새로운 원시 값을 재할당하게되면 새로운 메모리 공간에 재할당한 원시 값을 저장하게 되고, 변수는 새롭게 재할당한 원시 값의 메모리 공간의 주소를 참조하게 된다. 이런한 특성을 불변성 이라 한다.

메모리 공간의 주소가 변경된 이유는 원시 값이 변경불가능한 값이기 때문이다.

문자열과 불변성

원시 값은 타입별로 메모리 공간의 크기가 미리 정해져 있다.
ECMAScript에서는 원시 값 중 문자열 타입숫자 타입의 크기를 명확히 규정하고 있다.
그중 문자열은 몇 개의 문자로 이루어 졌느냐에 따라 필요한 메모리 공간의 크기가 결정된다.

문자열은 유사 배열 객체 이면서 이터러블 이라서 배열과 유사하게 각 문자에 접근할 수 있다.

유사 배열 객체란?
배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고, length 프로퍼티를 갖는 객체를 말함.

2️⃣ 값에 의한 전달

var score = 80;

var copy = score; // 변수 score를 할당!

console.log(score, copy); // 80 80
  • 변수에 원시 값을 갖는 변수를 할당하면, 할당받는 변수에는 할당되는 변수의 원시값이 복사되어 전달된다. 이를 값에 의한 전달이라 한다.
  • 원시 값을 할당한 변수(score)를 다른 변수(copy)에 할당 하게 되면 값에 의한 복사가 이루어 진다.
  • scorecopy 의 값은 다른 메모리 공간에 저장된 별개의 값으로 서로에게 영향을 주지 않는다.

score 변수 원시 값 재할당

var score = 80;

var copy = score;

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

score = 100;

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

score 와 copy 의 값은 다른 메모리 공간에 저장된 별개의 값이기 때문에, score값을 변경해도 copy의 값에는 아무런 영향을 주지 않는다.


객체

객체는 프로퍼티의 개수가 정해져 있지 않고, 동적으로 추가되고 삭제 가능하고, 프로퍼티의 값에도 제약이 없다.
원시 값과 같이 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없다. (변경 가능한 값)

1️⃣ 변경 가능한 값

  • 원시 값과는 다르게 객체는 변경 가능한 값이다.

  • 변수에 객체를 할당한 후 해당 변수가 가지는 메모리 공간에 접근하면 참조 값이 있다.

참조 값 : 생성된 객체가 저장된 메모리 공간의 주소 그 자체

객체는 변경가능한 값이기 때문에 원시 값 처럼 재할당으로 값을 변경해주는 것이 아닌 재할당 없이 객체를 직접 변경할 수 있다.

let obj = { name : 'lee' };

obj.name = 'kim'
obj.age = 1 

console.log(obj) // {name : 'kim' , age : 1 }

객체가 변경가능한 값으로 설계된 이유
객체 값원시 값과 다르게 메모리 크기가 일정하지 않고 프로퍼티 값 자체가 객체일 수도 있어서
원시 값과 동일하게 복사가 이루어 진다면 메모리 효율이 떨어지게 된다.

이와 같은 이유로 메모리를 효율적으로 사용하기 위해 객체는 변경 가능한 값으로 설계되어있다.

객체가 가지는 부작용 : 여러 개의 식별자가 하나의 참조 값 을 공유할 수 있다.

let obj = { name : 'lee' }
let copy = obj 

copy.name = 'kim'

console.log(obj) // { name : 'kim' }

얕은 복사, 깊은 복사

얕은 복사 : 객체의 1뎁스만 복사 되는 것
객체에 중첩되어 있는 경우 참조 값을 복사하는 것이다.
spread 연산자, Object.assign()

깊은 복사 : 객체에 중첩되어 있는 객체까지 모두 복사 되는 것
객체에 중첩되어 있는 객체까지 모두 복사해서 원시 값처럼 완전한 복사본을 만든는 것이다.
JSON 문법의 JSON.stringify()JSON.parse()를 이용 하거나
node.js 환경에서 외부 라이브러리인 lodash, ramda 사용

2️⃣ 참조에 의한 전달

let person = { name : 'lee' };
let copy = person;

객체를 담고 있는 변수를 다른 변수에 할당하게 되면 참조 값이 복사 되어 전달된다. 이를 참조에 의한 전달이라고 한다.

두개의 식별자(obj, copy)가 하나의 객체({name : 'lee'})를 공유한다는 것을 의미 한다.

profile
열심히 기록할 예정🙃

0개의 댓글