이터 타입은 크게 두 가지로 나뉜다 기본형과 참조형, 이 둘의 구분 기준은? => 값의 저장 방식과 불면성 여부
-값의 저장 방식
기본형 : 값이 담긴 주소값을 바로 복제
예) let num = 10 인 경우 10이란 값이 담긴 메모리의 주소값을 num에 저장
참조형 : 값이 담긴 주소값들로 이루어진 묶음을 가리키는 주소값을 복제
let arr = [ 1, 2 ,3]
[1이 들어있는 주소값, 2가 들어있는 주소값, 3이 들어있는 주소값] 이 묶음을 가르키는 주소값이 arr에 저장된다
=> arr은 주소값의 묶음을 가리키는 것이며 값 자체의 주소값을 가지진 않는다
=> arr안에 1을 가져오기 위해선 arr이 가진 주소값으로 가서 1을 가리키는 주소값을 찾아야한다
-불변성 여부
기본형 : 불변성을 띔
참조형 : 불변성을 띄지 않음
let a = 3 에서 a = 5로 재할당이 가능한데 뭐가 불변하다는 것일까?
이건 메모리에서 불변하다는 것이고 이를 알기 위해 메모리에 대한 내용도 알아야 한다
비트(bit) : 컴퓨터가 이해할 수 있는 가장 작은 단위,
바이트(byte) : 비트 8개 묶음, 연필을 12개씩 묶어서 1다스라고 말하는 것과 같다
식별자 : 어떤 값을 구별해서 식별할 수 있는 고유한 이름, 값이 아니라 메모리 주소를 가지고 있다
1000번대를 변수영역 5000번대를 데이터영역 7000번대 이후를 객체를 위한 별도의 영역이라고 했을 때
let a = 1일 때 let a라는 변수를 선언하고 1이라는 값을 할당한다 이 때 변수명 a가 식별자이다 그리고 1이 변수이다
const b = 2
let a = 1
let a라는 변수를 선언하고 1이라는 값을 할당한다 이 때 변수명 a가 식별자이다 그리고 1이 변수이다
const b = 2
주소 | ... | 1002 | 1003 | 1004 | 1005 | ... |
데이터 | a / 5002 | b/5003 | ||||
주소 | … | 5002 | 5003 | 5004 | 5005 | … |
데이터 | 1 | 2 |
a에 1이란 값을 할당 할 때 a와 1이 함께 메모리에 저장되지 않는다
1이란 값을 다른 공간에 만들고 a는 그 1이 저장된 공간을 가리키는 주소값을 가진다 그리고 a에 2라는 값을 재할당 한다면 a는 5003의 주소값을 가지게 바뀐다
- a에다가 값이 큰 다른 변수를 재할당해야하는데 1003에 다른 값으로 채워져 있다면 메모리는 a의 공간 확보를 위해 모든 값들을 뒤로 밀어야한다 그럼 많은 데이터를 다룰수록 많은 데이터 이동이 일어나게 된다
- 1이란 똑같은 값을 가지는 변수를 많이 만들어 낸다면 각 변수마다 1이란 공통된 값을 각각의 공간에 가지고 메모리를 많이 차지할 수 있는데 1이란 값을 따로 만들고 각각의 식별자들이 1을 가리키는 주소값만을 가져간다면 메모리를 적게 사용할 수 있다
변수 vs 상수 : 변수 영역 메모리의 변경
=> b는 5003이란 주소값을 다른 것으로 바꿀 수 없다 처음에 할당받은 주소값만을 유지함
(a는 5002(1)에서 5003(2)으로 혹은 5004에 3이란 값을 만들에 5004란 주소값을 가지는 식으로 재할당 할 수 있다)
기본형 vs 참조형 : 데이터 영역 메모리 변경
기본형을 아까와 같이 a = 1에서 a = 2로 재할당 할 때 위 표에서 a/5002 에서 a/5003으로 주소값만 변하고 a가 들어있는 1002는 변하지 않는다 하지만 참조형은 어떨까
let obj = { name : mjm, age : 25}
주소 | 1001 | 1002 | 1003 | 1004 |
데이터 | obj / 7101~2 | |||
주소 | 5001 | 5002 | 5003 | 5004 |
데이터 | 'mjm' | 25 |
obj를 위한 별도의 공간이 있다
주소 | 7101 | 7102 | 7103 | 7104 |
데이터 | name / 5001 | age / 5002 |
이렇게 저장이 되고 name에 새로운 값을 재할당 한다면 name가 가리키는 주소값이 바뀌고 이는 obj를 위한 별도의 공간(이곳이 obj의 데이터 영역)에 변화가 생기는 것이기에 가변하다고 표현한다
가비지컬렉터가 주기적으로 할당된 메모리 공간을 검사하여 더 이상 사용(참조)되지 않는 메모리들은 비워준다
'오늘 뭐했냐 > 개발에 대한 주저리' 카테고리의 다른 글
null과 undefined (0) | 2023.06.13 |
---|---|
깊은 복사와 얕은 복사 (0) | 2023.06.13 |
Set (0) | 2023.05.24 |
Map (1) | 2023.05.24 |
일급 객체로서의 함수 (2) (0) | 2023.05.24 |