변수 - 변할 수 있는,변경 가능한 데이터가 담길 수 있는 공간
0 또는 1만 표한할 수 있는 하나의 메모리 조각을 bit 라고 함
메모리는 수많은 비트로 구성되어 있는데, 각 비트는 고유한 식별자를 통해 위치를 확인할 수 있음
- but 이러면 쓸데없이 식별자가 너무 많기 때문에 bit보다는 조금 더 묶어서 byte라는 단위를 사용함 ( 1byte = 8 bit )
1 bit가 0,1 두개의 값을 가질 수 있으니깐 1 바이트는 2^8개의 값을 표현할 수 있음
자바나 C++ 같은 언어는 메모리 낭비를 막기 위해 데이터 타입별로 할당할 메모리 영역을 칼같이 정해놔서 값에 따라 어떤 타입으로 설정해야되는지를 고민해야 되지만, 자바스크립트는 좀 넉넉하게 숫자의 경우 그냥 값에 상관없이 8바이트를 확보해놓음
중요 -
모든 데이터는 바이트 단위의 식별자, 정확하게 메모리 주소값을 통해 서로 구분하고 연결할 수 있음
변수 - 변할 수 있는 수(number를 의미하는 건 아니고 그냥 데이터라고 생각하면 됨)
let a = 3
이렇게 했을 때 사실 a라는 변수명은 식별자라고 하는게 맞음 - 어떤 데이터를 식별하는데 사용하는 이름
변수 선언과 데이터 할당
데이터가 저장되는 곳은 변수 영역 / 데이터 영역을 따로 저장 - 데이터 변환을 자유롭게 하고 메모리를 효율적으로 관리하기 위해서
let a; 이렇게 저장하면 자바스크립트는 메모리에서 비어있는 공간을 확보하고 그 공간의 이름을 a라고 설정함
a = 'abc' or let a = 'abc'
이렇게 하게 되면 'abc'라는 데이터는 따로 보관해서 이 데이터의 주소를 a라는 공간에 저장해놓는 식
만약에 a = abcdef를 추가하라고 하면 저 abc가 담겨있는 주소의 값에 def를 추가하는 방식이 아니라
abcdef라는 새로운 데이터를 만들어서 또 새로운 주소에 저장해서, 그 주소를 a라는 데이터가 담긴 곳에 저장해놓음
기존 데이터는 자신이 주소를 저장하는 변수가 하나도 없게 되면 garbage collector의 수거 대상이 된다고함
이러한 특성때문에 기본형 데이터는 불변값이라고 함 // 'abc'라는 데이터가 'abcdfe'로 바뀌는게 아니라 따로 다른공간에 저장을 하는것뿐임abc라는 데이터는 그렇게 되면 참조하고 있는 곳이 한개도 없게 됨. 그러면 나중에 알아서 수거해감(용량이 부족해진다거나 이러면)
참조형데이터 할당 과정
let obj = {a:1 , b:'abc' , c:[3,4,5]}
(변수영역)주소 | 1001 | 1002 | 1003 | 1004 | 1005 |
---|---|---|---|---|---|
데이터 | 이름:obj / 값:5001 | ||||
(데이터영역)주소 | 5001 | 5002 | 5003 | 5004 | 5005 |
데이터 | 7000~7002 | 1 | 'abc' | 8000~8002 |
- 변수 영역의 빈 공간을 하나 확보하고(ex.1002번) , 이름을 obj라고 지정
- 데이터 영역(5001번) 에 값을 저장하려고 봤더니 여러 개의 프로퍼티로 이루어졌음 - 그래서 이것들을 하나하나 별도의 변수 영역(7000,7001,7002)에 저장하고, 각각의 주소를 5001번에 저장함(메모리 용량이 정해져있지 않고 필요할때 동적으로 결정된다고 함)
(변수영역)주소 | 7000 | 7001 | 7002 |
---|---|---|---|
데이터 | 이름:a / 값:5003 | 이름:b / 값:5004 | 이름:c / 값: 5005 |
- 기존 데이터영역에서 1 , 'abc'를 찾아보고 없으면 임의의 공간에 값을 저장하고(5003,5004) , 그 주소를 7000,7001번에 저장
- c의 경우 [3,4,5]라는 하나의 배열, 즉 객체가 있기 때문에 지금까지 한걸 한번 또 반복한다고 생각하면 됨
(변수영역)주소 | 8000 | 8001 | 8002 |
---|---|---|---|
데이터 | 이름:0/값 :5006 | 이름:1/값:5007 | 이름:2/값:5008 |
변수 영역 7002번의 변수영역 이름을 c라고 지정해주고, 5005번에 데이터 값을 지정해주려고 봤더니 여러 개의 프로퍼티로 이루어져있기 때문에 , 하나하나 별도의 변수 영역(8000~8002)에 저장해주고, 그 주소들을 5005번에 저장함
여기서 이름은 index번호를 부여해주고, 값의 경우에도 또 앞에서 했던것과 마찬가지로 데이터 영역의 주소를 저장해주면 됨
여기서 만약에 obj.a = 3으로 바꾼다면 ?
- 데이터 영역에서 3이 있는지를 확인함 - 없으면 빈 공간에(5001번이라고 가정) 3을 넣고 주소 이름이 a인 곳을 찾아서 기존에 참조하고 있던 주소를 5001번으로 바꿔줌
- 볼드처리된 저 핵심 내용은 바뀌지 않음 - 새로운 객체가 만들어진게 아니라, 객체 내부의 값만 바뀐거
'JS' 카테고리의 다른 글
this 정리 (0) | 2023.02.25 |
---|---|
undefined / null (0) | 2023.02.13 |
nullish coalescing (0) | 2023.02.01 |
호이스팅 (0) | 2023.01.30 |
호출스택과 이벤트 루프 정리 (1) | 2023.01.21 |