스터디/모던 자바스크립트 Deep Dive(24.02-24.06)

11장. 원시 값과 객체의 비교

minseokiim 2024. 3. 19. 18:46

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