자바스크립트에서 변수가 선언이 되면 stack메모리에 식별자가 저장이되고 할당되는 값에따라 데이터타입이 결정된다.
* 메모리에는 각각의 셀에 주소가 부여되어 있다 *
stack : 함수나 메서드의 지역변수 , 매개변소가 저장된다. 함수나 메서드가 호출될때마다 스텍프레임이 쌓임
heap: 객체가 저장됨
symbol(ES6)이란?
- 원래 객체 프로퍼티는 데이터타입은 문자형이다
(숫자나 불리언이어도 Object.keys(obj)로 빼면 문자형배열로 반환됨)- 문자형외, 또한가지 데이터타입으로 반환가능한데, 그것이 symbol형
- 유일성이 보장되므로(전체의코드중 딱하나) 유일한 식별자를 만들때 사용
기본형과 참조형은 메모리 상에서 저장되는 형태가 다르다.
/// 예시코드
let a='abc'
( 만약 값이 이미 다른 메모리공간에 있을때는 새로운 메모리공간에 또 저장하는것이 아니고 있는 메모리공간을 재사용을함.)
기본형처럼 참조형역시 변수를 선언하고 할당한다. 하지만 기본형은 선언과 할당이 동시에 일어나는 반면, 참조형은 선언이 먼저 이루어지고 그 후에 할당이 이루어진다.
/// 예시코드
let obj={
a:1,
b:'bbb'}
>>> 여기서 부터 한단계가 늘어남
[전체 프로세스]
지정된 주소에 들어있는 값을 바꾸는것이 아닌(불변성) 또다른 주소에 바뀔값을 저장-> 그 다른 주소값을 들고 다시 변수가 가리키는 주소로 이동-> 변수메모리공간(stack)들을 검색하다가 식별자와 변수가 같은 공간에가서 값을 들고간 주소로 변경
바꿀값을 새로운 메모리주소에 저장 (혹은 이미 저장되 있는 값이 있는지 검색) -> 데이터의 주소값을들고 -> 일단 obj를 찾아감 -> 값이 참조하고있는 주소값을 찾아감 -> 그 주소에서 확보한 공간의 주소값으로 감 -> 거기서 해당프로퍼티를 찾음 -> 값을 자신의 주소로 바꿔치기
👉 여기서 프로퍼티의 값의 주소는 바뀌지만 식별자(obj)의 값의 주소는 바뀌지 않는데 이는 기본형과 다르게 참조형은 메모리할당과정에 1단계를 더 거치기 때문이다.
[전체 프로세스]
🔥 여기서 잠깐🔥
✔️ 그럼 그 전의 값이 들어있는 공간은 어떻게 되느냐?
👉 아무도 참조를 하고 있지 않은상태, 참조를 하고 있는대상이 0인상황(참조카운트가 0이다라고 표현한다)
이런 메모리는 Garbage Collector, 줄여서 GC의 수집대상이 되어 자연스럽게 사라진다.
✔️ 데이터 메모리에 이미 할당될 값이 있는 경우?
👉 새로운 메모리공간에 또 저장하는것이 아니고 있는 메모리공간을 재사용함.
✔️ 만약에 재할당 하려는 값이 전의 값과 데이터타입이 다를경우?
👉 똑같다. 일단 빈 메모리공간에 바뀔 데이터를 저장, 주소를 들고 식별자를 찾고 값에있는 메모리주소를 찾아가서 , 확보된 공간에 가서 해당 변수를 찾아서 주소값을 바꿔준다.
✔️ 만약에 재할당 하려는 값이 전의 값과 데이터타입이 다를경우?
👉 똑같다. 일단 빈 메모리공간에 바뀔 데이터를 저장, 주소를 들고 식별자를 찾고 값에있는 메모리주소를 찾아가서 , 확보된 공간에 가서 해당 변수를 찾아서 주소값을 바꿔준다.
✔️ 그렇다면 중첩객체는?? (프로퍼티의 값이 배열일 때)
👉 모든 과정이 같지만 프로퍼티의 값을 저장하는 과정에서 다시한번 공간을 확보하고 이름에 인덱스, 값은 빈메모리공간에 저장하고 주소를 가져옴
✔️ 값에 데이터를 바로 넣지 않고 다른 메모리 공간에 저장한 후 메모리주소를 넣는이유??
👉 컴퓨터는 데이터를컴퓨터가 이해할 수 있는 이진법숫자들로 전환한 다음에 메모리에 저장하게 된다.
만약 굉장히 큰 용량을 차지하는 문자열을 이진법으로 저장하게되면 굉장히 길어진다.
처음에 값을 할당하는 경우에는 문제가 생기지 않지만, 나중에 값을 비교하는 상황이 오면 컴퓨터는 굉장히 긴 이진법을 하나하나 쭉 비교를 하게되며 이는 성능저하와 메모리 낭비를 야기한다.
심지어 같은 값을 가지고 있는 프로퍼티가 많아지게 된다면 성능은 더더욱 저하될 것이다.
반면, 한 메모리공간에 저장을해두고 주소값만 가져온다면
처음에 할당시 같은 값이 있는지 찾을때는 시간이 좀 걸리지만
한번 같은 주소값을 사용한다는것이 결정되고나면 똑같은 주소를 보고있다는것은 당연히 같은 값이라는 것이기 때문에 이후 비교를 하는과정이 훨씬 효율적이게된다. + 메모리도 훨씬 덜 차지