자바스크립트의 데이터 타입
- 원시타입 : 숫자, 문자열, 불리언, null, undefined, 심볼
- 객체 타입 : 객체
원시타입과 객체타입의 차이
- 원시 타입의 값(원시 값)은 변경 불가능한 값이나, 객체 타입의 값(객체)은 변경 가능한 값이다.
- 원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에는 실제 값이 저장되나 객체를 변수에 할당하면 변수(확보된 메모리 공간)에는 참조 값이 저장된다.
- 원시 값을 갖는 변수는 다른 변수에 할당 할 때 값에 의한 전달이고, 객체는 참조에 의한 전달이다.
1.원시 값
원시 타입의 값은 변경 불가능한 값으로 한번 생성된 원시 값은 읽기 전용으로서 변경할 수 없다.
원시 값의 불변성은 값에 대한 말이지 변수에 대한 말이 아닌 것에 주의 하자!
- 원시값은 읽기 전용 값이기에 데이터의 신뢰성을 보장한다.
- 불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 값을 변경할 수 있는 방법이 없다.
- => 만약 원시 값을 변경할 수 있다면, 변수 값도 변경될 수 있으므로 상태변경을 추적하기 어려워진다.
값에 의한 전달
값에 의한 전달이란, 변수에 원시 값을 갖는 변수를 할당하면 할당 받는 변수(아래 예제에서 a)에는 할당 되는 변수(아래 예제에서 b)의 원시 값이 복사되어 전달되는 것을 의미한다.
var b = 80; var a = b; console.log(a, b) //80 80 console.log(a === b) //true b = 100; console.log(a, b) //80 100 console.log(a === b) //false
원시 값이 복사되어 전달이 되지만, 할당 받는 변수와 할당 되는 변수는 서로 다른 메모리 공간에 저장된 별개의 값임에 주의 하자!
2. 객체
객체 타입의 값은 변경 가능한 값이다.
객체는 프로퍼티 수가 정해져 있지 않고 동적으로 추가 및 삭제가 가능하기 때문에 객체는 원시 값과 같이 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없다.
객체를 할당한 변수는 원시 값을 할당한 변수와는 다르게 변수가 기억하는 메모리 공간 주소를 통해 참조 값에 접근할 수있다. => 참조 값 : 생성된 객체가 저장된 메모리 공간의 주소
그리고 객체는 할당이 이뤄지는 시점에 객체 리터럴이 해석되고, 그 결과 객체가 생성된다.
var person = { name : 'Kim' }; console.log(person) //{name : "Kim"}
위 예제에서 person 변수는 객체 {name : 'Kim'} 자체를 가르키고 있다.
원시값은 변경 불가능한 값이라서 값의 변경을 위해서는 재할당 이외에 방법이 없지만, 객체는 변경 가능한 값이라서 재할당 없이 객체를 직접 변경할 수 있다. 즉, 객체 자체를 동적으로 프로퍼티를 생성, 수정, 삭제가 가능하다는 것이다.
이렇게 객체는 변경 가능한 값으로 설계 된 이유 : 객체는 크기가 매우 클 수도 있고, 원시 값 처럼 크기가 일정하지도 않다. 또한 프로퍼티의 값이 객체일 수도 있어서 복사해서 생성하는 비용이 많이든다.
이로 인해 메모리를 조금 더 효율적으로 사용하기 위해 객체는 변경 가능한 값으로 설계 되어 있다.
=> 원시 값과는 다르게 여러 개의 식별자가 하나의 객체를 공유할 수 있는 단점이 생겼다.
참조에 의한 전달
var person = { name : 'Kim' }; //참조에 의한 복사(얕은 복사) var copy = person;
위 예제에서 객체를 가르키는 변수(person)를 다른 변수(copy)에 할당하면 원본의 참조 값이 복사되어 전달된다.
즉 person이 가르키는 객체의 실주소가 '0x13579'라면 copy는 이 메모리 주소가 복사되어 전달된다. 그렇기에 copy의 메모리 주소도 '0x13579'가 된다.
이것은 두 개의 식별자가 하나의 객체를 공유한다는 뜻이다.
여기서 객체는 변경가능한 값이므로 두 개의 식별자에서 객체의 변경을 시도하면 다른 한 쪽 변수에서 영향을 받는다.
var person = { name : 'Kim' }; //참조에 의한 복사(얕은 복사) var copy = person; console.log(copy === person) //true //copy를 통해 객체를 변경 copy.name = 'Lee'; //person을 통해 객체를 변경 person.age = 20; //copy와 person은 동일한 객체를 가르킴 //그러므로 어느 한 쪽에서 객체를 변경하면 서로 영향을 받는다. console.log(person); //{name: 'Lee', age : 20} console.log(copy); //{name: 'Lee', age : 20}
정리
"값의 의한 전달"과 "참조에 의한 전달"은 식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달하는 것에서는 동일
그러나 변수가 저장되어 있는 값이 "값"이냐 "참조 값"이냐의 차이일뿐!
'자바스크립트' 카테고리의 다른 글
[JavaScript] 참조에 의한 전달과 외부 상태의 변경 (0) | 2021.10.12 |
---|---|
[모던자바스크립트 Deep Dive] 12. 함수 (0) | 2021.10.11 |
[모던자바스크립트 Deep Dive] 10. 객체 리터럴 (0) | 2021.09.30 |
[모던자바스크립트 Deep Dive] 옵셔널 체이닝 연산자와 null 병합 연산자 (0) | 2021.09.26 |
[모던자바스크립트 Deep Dive] 9.4 단축평가 (0) | 2021.09.23 |