📒

[코어 자바스크립트] 01. 데이터 타입

메모리

컴퓨터는 CPU를 사용해 연산하고 메모리를 사용해 기억한다.
메모리
데이터를 저장할 수 있는 공간. 메모리 셸의 집합체
메모리 셸
컴퓨터가 데이터를 저장하고 읽어들이는 단위
하나의 크기는 1bit. 2진수로만 저장한다.
각 셸은 메모리 공간의 위치를 나타내는 고유의 메모리 주소를 갖는다.

데이터의 단위

비트 단위로 위치를 확인하는 것은 매우 비효율적.
몇 개씩 묶어 하나의 단위로 여기면 표현할 수 있는 값도 늘고 검색 시간을 줄일 수 있음. 너무 많은 비트를 묶게되면 낭비되는 공간이 발생.
적정한 공간으로 바이트라는 단위가 생성됨
(예시로 지폐 단위를 생각하면 이해가 편하다.)
bit
하나의 메모리 셸 단위를 bit라고 한다.
byte
1byte = 8bit
1바이트는 256(282^8)개의 값을 표현할 수 있다.
JS의 숫자형 데이터는 정수형인지 부동소수형인지 구분없이 8bite(=64bit)를 확보한다.

변수

메모리 주소를 통해 직접 값에 접근하는 것은 치명적인 오류 발생 가능성을 높임. 따라서 JS에서는 개발자의 직접적인 메모리 제어를 허용하지 않는다.
값에 접근하려면 변수를 사용해야한다.
변수
변경 가능한 데이터가 담길 수 있는 공간
식별자(변수 이름) : 어떤 데이터를 식별하는데 사용하는 이름. 값이 아닌 메모리 주소를 기억한다
변수 값 : 데이터에 저장된 값
// 변수 이름과 변수 값은 실행 컨텍스트 내에서 key-value 형식인 객체로 등록되어 관리된다.

데이터의 선언과 할당

변수 영역에 바로 값을 대입하지 않는 이유?
데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리는 더욱 효율적으로 관리하기 위함.
타입에 따라 각각 다른 크기로 데이터 공간을 확보하게 되는데 숫자형과 달리 문자열은 특별히 정해진 규격이 없음. 만약 미리 확보된 공간 내에서만 데이터 변환을 할 수 있다면 데이터의 크기가 가변적이어야한다. 그러면 컴퓨터가 처리해야할 연산이 많아지게 된다.
기본형 타입 데이터의 선언과 할당
var a = 1;
JavaScript
복사
1.
변수 영역에서 빈 공간을 확보하고 그 공간의 식별자를 a로 지정
2.
데이터 영역의 빈 공간에 1을 저장한다.
3.
식별자 a가 가리키는 공간을 찾아 1을 저장한 공간의 주소를 저장한다.
중복된 데이터는 새로 데이터 공간을 확보해 저장하는 것이 아니라 기존에 저장했던 값을 찾아 있으면 데이터를 재활용한다.
참조형 데이터의 선언과 할당
var obj = { a: 1, b: 'hello' }
JavaScript
복사
1.
변수 영역에서 빈 공간을 확보하고 그 공간의 식별자를 obj로 지정
2.
여러 개의 프로퍼티로 이루어진 데이터 그룹이므로 내부 프로퍼티를 저장하기 위한 별도의 변수 영역을 마련하고 그 영역의 주소를 변수 영역 obj에 저장
3.
내부 프로퍼티를 저장하기 위한 변수 영역에 각각 프로퍼티 이름을 지정
4.
데이터 영역에서 프로퍼티값을 찾고 있다면 해당 주소를, 없다면 별도 데이터 영역을 마련해 저장 후 그 주소를 프로퍼티 변수 영역에 저장

불변값 / 가변값

변수와 상수를 구분짓는 성질은 변수 영역 메모리의 '변경 가능성'
바꿀 수 있다면 변수, 바꿀 수 없다면 상수
불변성 여부를 구분짓는 성질은 데이터 영역 메모리의 변경 가능성
기본형 데이터는 모두 불변값

가비지 컬렉터

런타임 환경에 따라 특정 시점이나 메모리 사용량이 포화 상태에 임박할 때마다 자동으로 수거 대상(참조 카운트가 0인 메모리 주소)들을 수거한다.
참조 카운트
어떤 데이터에 대해 자신의 주솔르 참조하는 변수의 개수
참조 카운트가 0인 메모리 주소는 가비지 컬렉터의 수거 대상이 된다.
수거된 메모리는 빈 공간이 된다.

변수 복사

기본형 데이터의 변수 복사
var a = 1; var b = a; b = 3;
JavaScript
복사
변수를 복사하면 a와 b 둘 다 같은 주소를 바라보고 있게 된다.
여기서 b의 값을 3으로 재할당 한다면?
데이터 영역에 3을 저장하고 있는 공간을 찾고 없다면 새로운 공간을 할당하고 그 주소를 b의 주소로 변경한다.

undefined / null

둘 모두 '없음'을 나타내는 값
undefined
값이 존재하지 않을 때 자바스크립트 엔진이 자동으로 부여하는 값
1.
값을 대입하지 않은 변수. 즉 데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근할 때
2.
객체 내부의 존재하지 않는 프로퍼티에 접근할 때
3.
return문이 없거나 호출되지 않는 함수의 실행 결과
비어있는 요소와 undefined를 할당한 요소는 다름
비어있는 요소는 순회와 관련된 많은 배열 메서드들의 순회 대상에서 제외된다. 당연함 배열도 객체임
사용자가 아무것도 하지 않은 채 값에 접근했을 때 undefined를 반환한다면 값 자체가 존재하지 않음을 의미
따라서 명시적으로 undefined를 대입하는 것은 지양해야함
null
비어있음을 명시적으로 나타낸 값
typeof null이 object이지만 이는 자바스크립트 자체 버그