변수(variable) : 변할 수 있는 수, 변할 수 있는 무언가
식별자(identifier) : 변수의 뜻에서 '무언가'는 데이터라 함.
숫자, 문자열, 객체, 배열 모두 데이터. 식별자는 어떤 데이터를 식별하는 데 사용하는 이름, 즉 변수명
변수 선언 a는 undefined이더라도 나중에 다른 값으로 바꾸면 된다
let a;
데이터 할당
var a; //변수 a선언
a = 'abc'; //변수 a에 데이터 할당
var a = 'abc'; //변수 선언과 할당을 한 문장으로 표현
불변값
변수(variable)와 상수(constant)를 구분하는 성질은 '변경 가능성'이다.
바꿀 수 있으면 변수, 바꿀 수 없으면 상수.
변수와 상수를 구분 짓는 변경 가능성의 대상은 변수 영역 메모리이다.
한 번 데이터 할당이 이뤄진 변수 공간에 다른 데이터를 재할당할 수 있는지 여부가 관건이다.
기본형 데이터인 숫자, 문자열, boolean, null, undefined, Symbol 모두 불변값이다.
데이터 불변성
var a = 'abc';
a = a + 'def';
var b = 5;
var c = 5;
b = 7;
(1-2번째줄)
변수 a문자열에 'abc'를 할당한 다음 'def'를 추가하면 'abc'가 'abcdef'로 바뀌는 것이 아님
새로운 문자열 'abcdef'를 만들고 그 주소를 변수 a에 저장함
'abc'와 'abcdef'는 완전히 별개의 데이터임
(4번째줄)
b를 숫자 5를 할당함
컴퓨터는 일단 데이터 영역에서 5를 찾고 없으면, 데이터 공간을 하나 만들어 저장한 후 그 주소를 b에 저장함
(5번째줄)
다시 같은 수인 5를 할당하려 함
컴퓨터에서 5를 찾음
4번째줄에서 이미 만들어놓은 값이 있으니 그 주소를 재활용함
(6번째줄)
변수 b의 값을 7로 바꾸려 함
기존에 저장된 5자체를 7로 바꾸는 것이 아니라
기존에 저장했던 7을 찾아서 있으면 재활용하고, 없으면 새로 만들어 b에 저장함
결국 5와 7 모두 다른 값으로 변경할 수 없음
문자열 값도 한 번 만든 값을 바꿀 수 없고, 숫자 값도 다른 것으로 변경할 수 없음
변경은 새로 만드는 동작을 통해서만 이뤄지는 것이 불변성(한 번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다)
가변값
var obj1 = {
a : 1,
b : 'bbb'
}
[변수 영역] | [데이터 영역] | [객체 @5001의 변수 영역]
- 변수영역 : 메모리 @1002에 변수 obj1을 값으로 메모리 @5001을 저장
- 데이터 영역 : 메모리 @5001에 데이터 그룹(프로퍼티)인 {a:1, b:'bbb'}을 저장
을 하려 했는데 데이터 그룹이기 때문에 이 객체 프로퍼티들을 별도로 저장하기 위해 - 객체 @5001의 변수 영역을 하나 더 만들고
그 영역의 주소의 메모리 @7103에 프로퍼티 a와 값으로 @5003을 저장, 메모리 @7104에 프로퍼티 b와 값은 @5001에 저장
참조형 데이터는 기본형 데이터와의 차이는 '객체의 변수(프로퍼티) 영역'이 별도로 존재한다는 점이다.
객체가 별도로 할애한 영역은 변수 영역일 뿐 '데이터 영역'은 기존의 메모리 공간을 그대로 활용하고 있다.
데이터 영역에 저장된 값은 모두 불변값이고, 변수에는 다른 값을 얼마든지 대입할 수 있다.
따라서 참조형 데이터는 불변하지 않다(가변값이다)라고 한다.
참조형 데이터 영역이 변경되는 것이 아니라 객체의 변수 영역이 변경되는 것이다
값을 직접 저장할 경우
- 데이터 할당이 빠름
- 비교에 비용이 많이 듦
- 메모리 낭비가 심함
값의 주소를 저장할 경우
- 데이터 할당이 느림
- 비교에 비용이 안 듦(메모리에 같은 값이 오직 하나만 존재함 👉🏻 불변값)
- 메모리 낭비 최소화
'웹 > JavaScript' 카테고리의 다른 글
자바스크립트 변수 복사 비교 (0) | 2022.11.21 |
---|---|
데이터 타입 Primitive Type VS Reference Type (0) | 2022.11.19 |
ES6. setPrototypeOf (0) | 2021.01.21 |
JS Object.assign() 객체 복사, spread operator( ...) 차이점 (0) | 2021.01.20 |
ES6. Class 클래스 (0) | 2021.01.19 |
댓글