- 요소
- 변수 영역
- 식별자(이름)
- lexcial evironment에 저장
- 데이터 영역
- 컴파일 언어는 변수 이름이 해당 메모리의 주소를 가르킨다면, 인터프리터 언어는 다름
- 왜 이렇게 바로 할당안하고 분리
- 메모리 효율
- 중복 데이터 저장 방지 (메모리 최적화)
- ex
-
let a = 1;
let b = 1;
- 변수 영역 (stack)
- 데이터 영역 (stack)
a, b
의 변수의 영역은 다르지만, 데이터 영역은 같다
- 값 복사의 단순화
- 값 자체를 복사하는 것이 아닌 주소를 복사
- 주소의 크기가 일정함으로 복사 속도에 이점
- 변수 주소의 size vs 변수 값의 size
- 8byte vs struct, class, object, map, array
- Data type별 메모리 할당
- 원시 타입의 메모리 할당
- 원시 타입의 값이 변경된다면 새로운 값을 데이터 영역에 추가한다
- 원시 타입이 불변성인 이유
- 원래 값이 있는 데이터 영역 메모리를 업데이트하는 것이 아닌 데이터 영역에 새로 추가
- 기존에 참조하던 데이터 값을 다른 변수가 참조를 안한다면
- ex
-
let a = 1;
let b = 1;
a = 2;
- 변수 영역 (stack)
- 데이터 영역 (stack)
- 원시 타입 불변성 장점
- 다른 변수가 참조하는 값에는 영향 없음
- 데이터 상태 변경을 최소화
- 참조형 타입의 메모리 할당
- 값을 데이터 영역에서 바로 저장이 아닌, 값을 저장하는 저장공간이 별도로 있다
- ex
-
let a = {
name: "kim"
}
a.name = "lee"
- 변수 영역 (stack)
- 데이터 영역 (stack)
-
주소 | 데이터 |
---|
201 | @401~? |
202 | ”kim” |
203 | ”lee” |
- Heap 영역 (heap)
- 참조를 통한 복사의 문제
- ex
-
let a = {
name: "kim"
}
let b = a
b.name = "lee"
console.log(a.name) // lee
console.log(a.name) // lee
console.log(a === b)// true
- 변수 영역
- 데이터 영역
-
주소 | 데이터 |
---|
201 | @401~? |
202 | ”kim” |
203 | ”lee” |
- Heap 영역
- b의 변경이 a에게도 영향을 미친다
- c, cpp에선 이것이 shallow copy
- js에선 값을 통한 복사로 문제 해결