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