JS/[책] 모던 자바스크립트 Deep Dive

11. 원시 값과 객체의 비교

배워도끝이없네 2021. 8. 23. 11:39

- 원시 값을 변수에 할당하면 변수에는 실제 값이 저장된다.

- 객체를 변수에 할당하면 참조값이 저장된다.

- 원시값을 갖는 변수를 다른변수에 할당하면 원시 값이 복사되어 전달된다. => pass by value

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

 

1. 원시 값

  1.1 변경 불가능한 값

  - 원시타입은 변경 불가능한 값을 갖는다.

  - 변경 불가능하다는 것은 변수가 아니라 값에 대한 진술이다.

  - 변수에 재할당하면 변수 값을 변경(실제로는 교체) 할 수 있다.

  

  1.2 문자열과 불변성

  - ECMAScript 사양에서 문자열(2바이트)과 숫자(8바이트) 이외의 원시 타입은 크기를 규정하고 있지 않다.

  - 문자열은 몇개의 문자로 이루어 졌느냐에 따라 필요한 메모리공간의 크기가 결정된다.

  - 숫자는 1도, 10000도 동일한 8바이트가 필요하다.

  - 문자열은 유사 배열 객체이면서 이터러블하다.

  * 유사 배열 객체 (array-like object)

  => 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length프로퍼티를 갖는 객체를 말한다.

  => 원시 값을 객체처럼 사용하면 임시 값을 감싸는 래퍼 객체로 자동 변환된다.

  

  1.3 값에 의한 전달

  - 원시 값은 pass by value이기 때문에 원시값을 할당받은 변수를 다른변수에 할당하고 값을 바꾸어도 변수를 할당받은 변수의 값은 변하지 않는다.

  - 값에 의한 전달도 사실은 값을 전달하는 것이 아니라 메모리 주소를 전달한다. 단, 전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있다.

 

2. 객체

- 프로퍼티의 개수가 정해져 있지 않으며 동적으로 추가되고 삭제할 수 있다.

- 따라서 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없다.

* 자바스크립트 객체의 관리 방식

=> 자바스크립트 객체는 키를 인덱스로 사용하는 해시테이블이라 생각할 수 있다.

=> V8엔진에서는 프로퍼티에 접근하기 위해 동적 탐색 대신 히든클래스라는 방식을 사용해 C++ 객체의 프로퍼티에 접근하는 정도의 성능을 보인다.

=> 히든클래스는 자바같은 고정된 객체 레이아웃(클래스)와 유사하게 동작한다.

 

  2.1 변경 가능한 값

  - 객체타입은 변경 가능한 값이다.

  - 객체를 할당한 변수는 객체의 참조주소 값을 메모리공간에 할당받는다.

  - 객체를 할당한 변수는 재할당 없이 객체를 직접 변경할 수 있다.

  - 원시값처럼 객체를 복사해서 생성하면 명확성과 신뢰성이 향상되겠지만 객체는 크기가 클 수 있고 메모리의 효율적 소비가 어렵다.

  - 여러개의 식별자가 하나의 객체를 공유할 수 있다는 단점이 생긴다(깊은복사 얕은복사)

 

  2.2 참조에 의한 전달

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

  - 자바스크립트는 참조에 의한 전달은 존재하지 않고 값에 의한 전달만이 존재한다고 말할 수 있다( 참조주소 값을 복사하기때문)

  - 공유에 의한 전달이라고 표현하는 경우도 있다.

'JS > [책] 모던 자바스크립트 Deep Dive' 카테고리의 다른 글

13. 스코프  (0) 2021.08.26
12. 함수  (0) 2021.08.23
10. 객체 리터럴  (0) 2021.08.19
9. 타입 변환과 단축 평가  (0) 2021.08.19
8. 제어문  (0) 2021.08.18