원시 타입 vs 객체(참조) 타입

seo·2021년 11월 11일
0
post-thumbnail

데이터 타입


데이터 타입은 원시 타입(primitive type)객체/참조 타입(Object/reference type)으로 분류할 수 있다.

원시 타입 VS 객체(참조) 타입

✔️원시 타입의 값은 변경 불가능한 값이다.

한번 생성된 원시 값은 읽기 전용값으로서 변경할 수 없다.
변수와 값은 같은것이 아니다.
변수 : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 or 그 메모리 공간을 식별하기 위해 붙인 이름
: 변수에 저장된 데이터로서 표현식이 평가되어 생성된 결과

변경 불가능 하다는 것은 변수가 아니라 값에 대한 진술이다.
변수는 언제든지 재할당을 통해 변수 값을 변경(엄밀히 교체)할 수 있다.
재할당이 금지된 변수는 상수이다.
const 키워드를 사용해 선언한 변수는 재할당이 금지된다. 상수는 재할당이 금지된 변수이다.
원시 값을 할당한 변수에 새로운 원시 값을 재할당 하려면

원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에는 실제 값이 저장된다.
메모리 공간에 있는 원시 값을 변경하는 것이 아니라 새로운 메모리 공간을 확보하고 재할당 값을 저장한 후 변수는 새롭게 재할당한 원시 값을 가리킨다. 이 때 참조하던 메모리 공간의 주소가 바뀐다. 값의 이러한 특성을 불변성이라 한다.
만약 재할당 이외에 원시 값인 변수 값을 변경할 수 있다면 예기치 않게 변수 값이 변경될 수 있다는 것을 의미한다. 이는 상태 변경을 추적하기 어렵게 만든다.

✔️객체 타입의 값은 변경 가능한 값

객체를 할당한 변수를 참조하면 메모리에 저장되어 있는 참조 값을 통해 실제 객체에 접근한다.

//할당이 이뤄지는 시점에 객체 리터럴이 해석되고, 그 결과 객체가 생성된다.
var person ={
	name: 'Lee'
}
//person 변수에 저장되어 있는 참조 값으로 실제 객체에 접근한다.
console.log(person)


객체를 변수에 할당하면 변수(확보된 메모리 공간)에는 참조 값이 저장된다. 참조 값은 생성된 객체가 저장된 메모리 공간의 주소이다.
객체는 변경 가능한 값으로 재할당 없이 프로퍼티를 동적으로 추가할 수도 있고 프로퍼티 값을 갱신, 삭제할 수 있다.

객체는 왜 변경가능한 값일까❗️
객체를 변경 할때마다 원시 값처럼 이전 값을 복사해서 새롭게 생성한다면 명확하고 신뢰성이 확보되겠지만 객체는 크기가 매우 클수도 있고,객체는 원시 값처럼 크기가 일정하지도 않다. 복사해서 생성하는 비용이 많이 들기 때문에 메모리의 효율적 소비가 어렵고 성능이 나빠진다.

✔️다른 변수에 할당하는 경우 - 원시 타입

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

var score = 80;
var copy = score;

score = 100; 

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

변수에 원시 값을 갖는 변수를 할당하면 할당받는 변수(copy)에는 원시값이 복사되어 전달된다.
score 변수와 copy 변수의 값은
다른 메모리에 저장된 별개의 값이다. 따라서 score 변수의 값을 변경해도 copy변수의 값에는 어떠한 영향도 주지 않는다.

✔️다른 변수에 할당하는 경우 - 객체 타입(얕은 복사)

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

var person = {
	name :'Lee'
};
//참조 값을 복사(얕은 복사)
var copy = person;

copy.name = 'Kim';
person.address = 'Seoul';

console.log(person) //{name: "kim", address: "Seoul"}
console.log(copy) //{name: "kim", address: "Seoul"}

객체를 가리키는 변수 person을 다른 변수 copy에 할당하면 원본의 참조 값이 복사되어 전달 된다. 따라서 person과 copy는 동일한 참조 값을 갖는다. 즉, 원본 person과 copy 모두 동일한 객체를 가리킨다. 두 개의 식별자가 하나의 객체를 공유하는 것이다. 따라서 사본 중 어느 한쪽에서 객체의 프로퍼티 값을 변경 할 경우 서로 영향을 주고 받는다.

참고
모던 자바스크립트 Deep Dive

0개의 댓글