데이터타입과 변수

2020. 7. 19. 18:54TypeScript&JavaScript/JavaScript

자바스크립트는 메모리 공간을 비교적 넉넉하게 사용. 숫자의 경우 기본 8바이트 (1비트는 +- 부호, 11비트는 지수부, 52비트 가수부)
모든 데이터는 메모리 주솟값을 통해 서로 구분하고 연결할 수 있다.

변수 - 변경 가능한 데이터가 담길 수 있는 공간
: 변할 수 있는 데이터를 담는 공간을 만든다. 이 데이터의 식별자는 a로 한다 ->let a
변수명은 공간의 이름, 식별자

변수영역과 데이터 영역
정확히는 식별자의 메모리 주소값의 '값'에는 데이터가 저장된 메모리 주소값이 들어간다. 장점은 메모리 용량의 가변성 보장

이렇게 할 경우 변수의 데이터를 변경할 경우 변경될 데이터를 새 메모리 공간에 넣고 값에 저장된 주소값을 변경
이 때, 주소값이 저장된 곳이 하나도 없을 경우 해당 메모리는 가비지 컬렉터의 대상이 됨

변수와 상수를 구분짓는 변경 가능성의 대상은 변수 영역 메모리. 즉 데이터 할당이 이뤄진 변수공간에 다른 데이터를 재할당 가능한지.
반면 불변성 여부를 구분할 때의 변경 가능성 대상은 데이터 영역 메모리

불변값은 기본형 데이터, 문자열, boolean, null, undefined, Symbol

해당 데이터를 바꾸는것은 데이터를 바꾸는 것이 아니라 새로 만든 데이터영역의 메모리 주소를 재할당하는 것

참조형 데이터는 반면 변경가능한 값
객체의 프로퍼티를 저장하기 위한 메모리 영역은 크기가 정해져 있지 않고 필요한 시점에 동적으로 확보
객체의 변수 영역의 데이터에는 프로퍼티:데이터가 들어있고 해당 데이터는 기존 데이터 영역의 메모리 주소 위치를 참조
참조하는 주소가 변경 가능하기 때문에 참조형 데이터는 불변하지않다(immutable하지 않다) ->가변값이다 라고 표현

어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수를 참조 카운트라고 한다. 참조 카운트가 0인 메모리 주소는 가비지컬렉터의 수거대상이 된다.

자바스크립트의 모든 데이터는 엄밀히는 참조형 데이터, 다만 기본형은 주소값을 복사하는 과정이 한 번이고, 참조형은 한 단계를 더 거치게 됨. 따라서 참조형 데이터는 데이터 값이 변한것처럼 보이지만 사실은 참조형의 프로퍼티 내의 데이터 영역의 주소값을 재할당하다보니 변하는 것처럼 보이고 이는 해당 참조형 데이터를 참조하는 모든 곳에 영향을 끼침

let a = 10; 
let b = a; 
b = 15; 

a !== b 


let obj1 = { c: 10, d: 'ddd' } 
let obj2 = obj1 
obj2.c = 20; 

ojb1 === obj2 



-> 참조하는영역의 메모리 주소가 같고 프로퍼티 영역의 데이터 메모리주소가 재할당 되기 때문에 데이터의 재할당이 두 객체 모두에게 영향을 끼침

이 경우, obj2에 할당된 값을 바꾸고 싶다면
참조하는 객체 대상을 새로 할당하면 됨.
obj2 = {c: 20, d: 'ddd'} 이런식으로 선언하면 아예 새로운 객체 참조 메모리 영역을 할당하고 거기서 프로퍼티에 대한 메모리 주소를 참조하기 때문에 서로 다른 객체로서 분리된다.

참조형 데이터가 가변값이라고 설명할때의 '가변'은 참조형 데이터 자체를 변경할 경우가 아니라 그 내부의 프로퍼티를 변경할 때만 성립함.