0. 원시타입과 객체타입의 다른 점
1) 원시 값은 변경 불가능한 값, 객체는 변경 가능한 값
2) 원시 값을 할당한 변수에는 실제 값이 저장, 객체를 할당한 변수에는 참조 값이 저장됨
3) 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시값이 복사되어 저장됨 -> 값에 의한 전달
객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달 -> 참조에 의한 전달
1. 원시 값
변경 불가능한 값 : 원시 값 자체 변경 불가능한단 거지, 변수 값을 변경 할 수 없단게 아님.
변수는 언제든지 재할당 통해 변수값 변경 가능(<-> 상수)
원시 값을 할당한 변수에 새로운 원시 값을 재할당 하면 메모리 공간에 저장되어 있는 재할당 이전의 원시 값 변경하는 것이 아니라, 새로운 메모리 공간을 확보하고 재할당한 원시값을 저장한 후, 변수는 새롭게 재할당한 원시값을 가리킴.(불변성)
이때 변수가 참조하던 메모리 공간의 주소가 바뀜.
-> 불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값 변경 할 수 있는 방법 없음.
원시 값을 저장하려면 먼저, 확보해야 하는 메모리 공간 크기를 결정해야 함.
ECMAScript 사양에 문자열 타입과, 숫자 타입 이외의 원시타입은 크기 규정 x 제조사마다 다름
-> 1개의 문자는 2바이트의 메모리 공간에 저장, 문자열은 몇개의 문자로 이뤄졌는지에 따라 메모리 공간 크기 결정됨.
숫자 값은 1도 100000도 동일하게 8바이트
문자열은 유사배열 객체이면서, 이터러블이므로 배열과 유사하게 각 문자에 접근 가능, 하지만 원시 값이므로 변경은 불가능 함 -> 데이터의 신뢰성
(* 유사배열 객체 : 인덱스로 프로퍼티 값에 접근 할 수 있고, length 프로퍼티를 갖는 객체)
값에 의한 전달 : 원시 값이 복사되어 전달됨.
2. 객체
객체는 프로퍼티 개수가 정해져있지 않으며, 동적으로 추가되고 삭제 할 수 있고 값에도 제약 없음 -> 확보해야 할 메모리 공간의 크기를 사전에 정해둘 수 없음.
* 히든 클래스 방식 사용
자바스크립트 엔진은 프로퍼티를 저장하기 위해서 사전식 데이터 구조를 이용함.
V8은 hidden class를 이용함. 객체에 새로운 프로퍼티를 추가할 때 hidden class를 생성하고 hidden class에 프로퍼티의 정적인 위치를 저장함 -> 실제 데이터가 저장되어 이는 위치에 대한 Pointer를 제공
참조 값 : 생성된 객체가 저장된 메모리 공간의 주소
객체는 변경 가능한 값이므로, 원시 값과 다르게 메모리에 저장된 객체를 직접 수정 할 수 있음. 재할당이 아니므로 참조값은 변경되지 않음.
Q. 객체가 변경 가능한 값인 이유?
객체는 크기가 매우 클 수도 있고, 크기가 일정하지도 않고, 프로퍼티 값이 객체일 수도 있어서 복사하기에는 비용이 많이 들기 때문.
++ 얕은 복사와 깊은 복사
얕은 복사 : 객체에 중첩되어 있는 객체의 경우 참조 값을 복사
깊은 복사 : 객체에 중첩되어 있는 객체끼지 모두 복사해서 원시 값 처럼 완전한 복사본을 만든다
객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달 됨 -> 참조에 의한 전달
저장된 메모리 주소는 다르지만, 동일한 참조값을 가짐(두개의 식별자가 하나의 객체를 공유)
'스터디 > 모던 자바스크립트 Deep Dive(24.02-24.06)' 카테고리의 다른 글
13장. 스코프 (0) | 2024.04.01 |
---|---|
12장. 함수 (0) | 2024.04.01 |
10장. 객체 리터럴 (0) | 2024.03.19 |
9장. 타입 변환과 단축 평가 (0) | 2024.03.19 |
8장. 제어문 (1) | 2024.03.14 |