2차 공부/TIL

24.07.23 변수선언과 데이터 할당 / 불변하다 vs 불변하지 않다.

공대탈출 2024. 7. 23. 14:15
let str = 'test'

str = 'modify'

변수 선언 및 할당 시 변수이름(식별자)와 변수(데이터)가 각각 메모리 상에 저장된다.

아래와 같이 식별자(변수이름)은 1002번 주소에 str로 저장되고, 해당 식별자가 지닌 변수(데이터)의 주소를 가지는 것을 알 수 있다.

데이터는 따로 주소값을 받아 저장되는데, 처음 5008번을 받고 다시 재할당되자 기존 데이터 주소는 변화시키지 않은 채로 새롭게 주소값을 받아 5009번에 modify를 저장하고, 해당 주소를 str 식별자에 붙여준다.

 

변수 선언 및 할당 시 메모리 저장 가상도

 

변수 vs 상수

 - 변수 : 변수 영역 메모리를 변경할 수 있음

 - 상수 : 변수 영역 메모리를 변경할 수 없음

 

불변하다 vs 불변하지 않다

 - 불변하다 : 데이터 영역 메모리를 변경할 수 없음

 - 불변하지 않다 : 데이터 영역 메모리를 변경할 수 있음

 


let obj = {
	a: 1,
    b: 'bbb'
}

객체를 선언하면 obj1을 1002에 넣어주고, 해당 참조형 데이터를 위한 메모리공간을 할당해준다.

a와 b를 해당 영역에 넣어주고(7103, 7104) 데이터 영역에서 해당 데이터값을 저장하고(5006, 5007) 주소값을 연결해준다.

그리고나서 obj1인 1002번에 obj1영역에서의 세팅된 주소들을 연결해준다.(7103~7104)

 

obj1.a = 2

a값이 변경되면 데이터 영역에서 해당 값이 있는 곳을 찾고 없다면 새로운 주소에 해당 데이터를 넣는다.

그리고 obj1영역에서 a에 해당하는 5006번 주소를 5008번으로 변경시킨다.

데이터 영역에 저장된 값은 여전히 불변값이지만, obj1을 위한 영역의 값은 5006>>5008로 변경되었기 때문에 불변하지 않다(가변하다)라고 한다.

 


let obj = {
	x: 3,
    arr: [3, 4, 5],
}

객체 속에 배열이 들어있다고 가정해보자.

1. obj를 1001에 할당한다.

2. obj의 x를 obj영역의 7103에 할당한다.

3. x의 값인 3을 데이터 영역에서 탐색한다. 데이터가 존재하지 않으므로 5001에 값을 넣는다.

4. 7103의 x에 해당 주소값인 5001을 붙여준다.

5. arr을 obj영역의 7104에 할당한다.

6. arr은 참조형 데이터이므로 해당 영역을 따로 할당한다.

7. arr의 0번 인덱스인 값인 3을 데이터 영역에서 찾는다. 5001번을 8104에 연결한다.

8. 1번 인덱스 값인 4를 데이터 영역에서 찾는다. 없으므로 5002번에 4를 넣어주고 8105에 연결해준다.

9. 2번 인덱스 값인 5를 데이터 영역에서 찾는다. 없으므로 5003번에 5를 넣어주고 8106에 연결해준다.

10. arr인 7104에 8104~8106을 연결해준다.

11. obj에 x와 arr인 7103~7104를 연결해준다.

 

 


변수복사의 비교

let a = 10;
let obj1 = {c: 10, d: 'ddd'}

let b = a;
let obj2 = obj1;

 

 

변수 복사 후 값 변경

let a = 10;
let obj1 = {c: 10, d: 'ddd'}

let b = a;
let obj2 = obj1;

b = 15;
obj2.c = 20;

a와 b는 다른 주소값을 바라보게 되지만, obj1과 ob2는 다른 값을 가져야하는데, 같은 주소값을 가지고 있어 두 객체 모두 값이 변경되어버린다. >>> 의도치 않은 버그를 초래함

 

 

let a = 10;
let obj1 = {c: 10, d: 'ddd'}

let b = a;
let obj2 = obj1;

obj2 = {c: 20, d:'aaa'}

이렇게 같은 키값일지라도 새로운 객체 형태로 바꿔준다면 obj2를 위한 영역이 생겨 같은 변수를 가질 지라도, 다른 영역을 바라보게되어 값을 변경해도 같이 변경되지 않는다.