모던 자바스크립트 Deep Dive - 11장 원시 값과 객체의 비교
Study
JavaScript
2024.01.16
11. 원시 값과 객체의 비교
- 원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에 실제 값 저장
객체를 변수에 할당하면 변수(확보된 메모리 공간)에는 참조 값 저장 - 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달 → 값에 의한 전달 (pass by value)
- 객체를 가르키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달 → 참조에 의한 전달 (pass by reference)
11.1 원시 값
11.1.1 변경 불가능한 값
-
원시 값(원시 타입(primitive type) 값)은 변경 불가능한 값
- 변수: 하나의 값을 저장하기 위해 확보한 메모리 공간
값: 변수에 저장된 데이터로서 표현식이 평가되어 생성된 결과 - 즉, 변경 불가능하다는 것은 변수가 아니라 값에 대한 진술.
- 변수: 하나의 값을 저장하기 위해 확보한 메모리 공간
-
원시 값을 할당한 변수에 새로운 원시 값을 재할당하면?
- 메모리 공간에 저장되어 있는 재할당 이전의 원시 값을 변경하지 않고, 새로운 메모리 공간을 확보하고 재할당한 원시 값을 저장
→ 변수는 새롭게 재할당한 원시 값을 가리킨 후 변수가 참조하던 메모리 공간의 주소가 바뀜 (불변성(immutability) 을 뜻함)- [참고 이미지 1]
- [참고 이미지 2] 만약 원시 값이 변경 가능한 값이라면?
- [참고 이미지 1]
- 불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없음
- 메모리 공간에 저장되어 있는 재할당 이전의 원시 값을 변경하지 않고, 새로운 메모리 공간을 확보하고 재할당한 원시 값을 저장
11.1.2 문자열과 불변성
- 문자열은 유사 배열 객체이며 이터러블이므로 배열과 유사하게 각 문자에 접근 가능
- 하지만.. 문자 하나씩은 변경 불가 (원시 값이기에!)
11.1.3 값에 의한 전달
- 코드 예시
var score = 80; var copy = score; // 80 score = 100; console.log(score, copy); // 100 80
- 변수
copy
에 원시 값을 갖는 변수score
를 할당하면
할당 받는 변수copy
에 할당 되는 변수score
의 원시 값이 복사되어 전달됨!
→ 값에 의한 전달 (pass by value) - 각 변수의 값이 같더라도 다른 메모리 공간에 저장된 별개의 값!
- 변수
- "값에 의한 전달"에 대한 오해 (자바스크립트를 위한 용어가 아니므로!)
- 자바스크립트에서 변수에 값이 전달되는 것이 아니라 메모리 주소가 전달됨
(변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하기에)
- 자바스크립트에서 변수에 값이 전달되는 것이 아니라 메모리 주소가 전달됨
11.2 객체
11.2.1 변경 가능한 값
- 객체(참조) 타입의 값, 즉 객체는 변경 가능한 값
- 객체를 할당한 변수가 기억하는 메모리 주소를 통해 메모리 공간에 접근하면 참조 값(reference value)에 접근할 수 있음
- 참조 값은 생성한 객체가 저장된 메모리 공간의 주소
- 이러한 특징에 의해 여러 개의 식별자가 하나의 객체를 공유하는 부작용이 있음!
- 값에 의한 전달과 참조에 의한 전달은 식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달한다는 면에서 동일
- 즉, 자바스크립트에는 값에 의한 전달만 존재한다고 할 수 있음
- 공유에 의한 전달이라는 표현도 있지만 ECMAScript 사양에 정의된 공식적인 언어가 아님! (이 같은 동작 방식을 설명하는 정확한 용어가 존재하지 않음..)