var a; // 변수 선언
a = "namju"; // 변수 a에 데이터 할당
var b = "namjuyun"; // 변수 선언과 할당을 한 문장으로 씀 (일어나는 일은 동일)
var a; // 변수 선언
➡️ 변할 수 있는 데이터를 만든다, 이 데이터의 식별자는 a
로 한다
= 변경 가능한 데이터가 담길 수 있는 공간, 그릇을 만드는 것
실제 메모리 영역에서 일어나는 일
- 메모리에 비어있는 공간 하나를 확보
- 그 공간의 이름(식별자)을 a
라고 지정
a = "abc"; // 데이터 할당
실제 메모리 영역에서 일어나는 일
- 데이터를 저장하기 위한 별도의 메모리 공간을 다시 확보
- 문자열 'abc'
를 저장
- → 그 주소를 변수 영역에 저장함
변수영역에 직접 데이터를 할당하지 않는 이유
→ 데이터 변환을 자유롭게 할 수 있게 하며, 메모리를 더욱 효율적으로 관리하기 위해ex) 변수영역에서 데이터 변환이 일어난다면 해당 공간의 크기를 늘리는 작업이 필요
이 작업이 앞뒤로 다른 데이터들이 있는 상황에서 일어난다면?
→ 뒤의 데이터들을 모두 옮기고 다시 식별자에 연결하는 작업이 필요해짐
a = a + "def"; // 'abcdef'로 재할당
실제 메모리 영역에서 일어나는 일
- 새로운 데이터를 저장하기 위한 다른 메모리 공간 확보
- 그곳에 데이터 'abcdef'
저장
- 새로운 메모리 주소를 a
변수와 연결 (기존의 데이터는 가비지 컬렉터의 대상이 됨)
다수의 변수들이 같은 값을 가지고 있을 때엔?
a
,b
,c
,d
,e
,f
변수들 모두5
를 할당 했을 때엔
5가 있는 데이터 공간이 6개 만들어지는 것이 아닌,
한개만 만들어서 그 값을 6개의 변수 영역들이 참조한다.
➡️ 중복 데이터 처리 효율 높아짐!
변수, 상수(constant)
변수 영역의 메모리가 변경 가능한지?
= 변수에 할당한 데이터 식별자가 변경될 수 있는지?
불변성
데이터 영역의 메모리가 변경 가능한지?
이미 존재하는 데이터를 바꿀 수 있는지? 아니면 새로 데이터를 만드는지?
기본형 데이터 Number
, String
, Boolean
, null
, undefined
, Symbol
은 모두 불변값
절대 한 데이터 주소 내의 값을 바꾸지 않고, 그냥 새 데이터 주소에 새 값을 만들어서 재할당한다!
var a = "abc";
a = a + "def";
변수 a
에 문자열 'abc'
를 할당한 이후 뒤에 'def'
를 추가
→ 기존의 'abc'
가 바뀌는 것이 아닌, 새로운 문자열 'abcdef'
를 생성하고 이를 변수 a
에 저장함
var b = 5;
var c = 5;
b = 7;
변수 b
에 할당할 숫자 5
가 이미 메모리에 있는지 확인, 없으니까 새로 만들어서 할당
변수 c
에 할당할 숫자 5
가 이미 있으니까 그 주소를 할당
변수 b
의 값을 7
로 바꾸고 싶음 → 있던 5
를 바꾸는 것이 아니라 7
이 담긴 영역을 새로 만듦
➡️ 결론, b
는 새로만든 7
를 저장, c
는 원래 있던 5
를 저장하고 있다!
불변값의 성질 = 한번 만들어진 값은 가비지 컬렉팅 당하지 않는 한 영원히 변하지 않는다.
참조형 데이터는 기본적 성질은 모두 가변값 (불변값으로 만들 수 있는 방법도 있음)
var obj1 = {
a: 1,
b: "bbb",
};
'obj1'
으로 정한다 @1002'a'
, 'b'
@7103, @71041
, 'bbb'
를 각각 저장 @5003, @5004'a'
, 'b'
에 할당obj1.a = 2;
참조형 데이터가 가변적인 이유
기본적으로 데이터 영역에 저장된 값은 기본형과 똑같이 모두 불변값
하지만 객체의 프로퍼티 영역이 또 있는 구조이므로, 여기에는 다른 값들이 재할당될 수 있음
그러면 obj1
가 참조하고 있는 주소값은(@5001
)는 달라지지 않으면서 객체의 프로퍼티는 다른 값을 가지게 됨!
➡️ 가변성!!
obj1 = "string";
새로운 데이터 'string'
을 만들어 'obj1'
은 그 주소값을 다시 저장
➡️ 아무에게도 참조되지 않는 주소값이 생겨버림 (객체 프로퍼티의 변수 영역을 담고있는 데이터, 프로퍼티 영역의 변수들, 프로퍼티 변수들에 할당된 데이터값들)
➡️ 참조 카운트
가 0이 된 메모리 주소는 순차적으로 가비지 컬렉터가 수거한다
var a = 10;
var b = a;
a
를 지정10
이 데이터에 있는지 확인하고 없으면 빈 공간에 저장a
에 저장b
를 지정하고 식별자 a
를 검색해 값을 찾아와서 b
에 저장a = 20;
20
이 데이터에 있는지 확인하고, 없으니까 빈 공간에 저장a
에 다시 할당10
주소값은 여전히 있고, b
에 의해 참조되고 있음! 깔끔하게 복사완료!var obj1 = { c: 10, d: "ddd" };
var obj2 = obj1;
obj1
를 지정obj1
에 할당c
, d
변수 지정10
, 'ddd'
저장 → 각각 변수들에 할당obj2
를 지정하고 식별자 obj1
가 참조하는 데이터를 저장obj1.c = 20;
console.log(obj1); // { c: 20, d: "ddd" }
console.log(obj2); // { c: 20, d: "ddd" }
20
이 데이터에 없으니 새로 만들고, 이를 프로퍼티 c
에 저장함obj2 = { c: "hi", d: "everyone" };
console.log(obj1); // { c: 20, d: "ddd" }
console.log(obj2); // { c: "hi", d: "everyone" }
하지만 이렇게 새로운 객체를 할당해버리면, 아예 새로운 객체 영역이 생성되고, 새로운 참조값이 생김
➡️ 기본형 데이터와 같은 방식으로 재할당이 일어나게 됨!
'가변'은 참조형 데이터 자체를 변경할 경우가 아닌, 그 내부의 프로퍼티를 변경할 때만 성립