중간에 위치.
- 배운 것을 '압축'적인
키워드로 정리키워드를 통한 자연스러운회상효과회상을 통해 자신의 방식으로 정리, 보충
- cloud, visit(add)
- shortest path
- update
주제: 데이터 타입
- 기본형, 참조형
- 불변, 가변
- 변수 영역, 데이터 영역
- 참조형을 불변으로
5라는 숫자를 100개의 변수에 대입하는 상황을 생각해보자. 일단 식별자 100개를 마련하고, 식별자에 대응하는 주소마다 5의 값을 넣을 수 있다. 이렇게 하면 똑같은 5 라는 숫자를 메모리에 100번 저장하는 결과를 낳는다.
변수영역과 데이터영역을 나누면 이러한 문제를 해결할 수 있다. 변수영역에는 식별자와 그에 대응하는 데이터 영역의 주소를 넣는다. 데이터 영역에는 실제 값을 저장한다. 이렇게 하면, 5라는 값을 데이터 영역에 한번만 저장하고도 100개의 변수에 대입할 수 있어서 효율적인 메모리 운영이 가능해진다.
참조형 변수에 저장되는 값이 변수 영역의 주소이기 때문에 그렇다. 예를 들어, 대표적 참조형인 객체를 살펴보자. 아래와 같은 객체에서 name 을 다르게 바꾸면, 어떤일이 일어날까?
const person = {
name: "fall",
};
const person2 = person;
person2.name = "Jin";
console.log(person === person2); // true
이름을 바꾸면 person.name 의 주소영역에 새로운 데이터("Jin") 이 가리키는 주소값이 할당된다. 즉, person 식별자 자체에 할당된 주소값은 전혀 달라지지 않았다. 이 경우, 위와 같이 두 객체가 서로 다른데도 같다고 나와버려, 데이터가 변경된데 대한 가시성이 떨어진다는 것을 볼 수 있다.
해결하는 방법은 여러가지 이다. 동등성 비교를 지원하는 언어의 경우, 해당 비교 연산을 override 해서 새롭게 정의해주는 방법이 있다. 그렇지 않다면, 속성이 변경될때마다, 아예 새로운 객체를 돌려주는 방법이 있다.
새로운 객체를 만들어주는 방법도 다양하다. 깊은 복사 를 구현하기 위해서는, spread operator 를 활용하거나, 라이브러리를 사용해도 되고, JSON.parse, stringify 를 적용할 수 도 있다.
- 콜 스택
- 실행 컨텍스트 - Lexical Environment
- environmentRecord, 호이스팅