Types
코드에서 사용되는 모든 데이터는 메모리에 저장되고 참조되어야 하며, 이를 위해 데이터 타입이 중요한 역할을 한다.
데이터 타입은 메모리에 데이터를 저장할 때 필요한 공간의 크기와 할당 가능한 유효한 값의 범위를 정의할 뿐만 아니라, 메모리에 저장된 2진수 데이터를 어떻게 해석해야 할지에 대한 정보를 컴퓨터와 개발자에게 제공함으로써 효율적인 메모리 관리와 데이터 처리를 가능하게 한다.
javaScript는 동적 타이핑 언어로 변수의 타입이 런타임에 결정되고, 타입은 Primitive type과 Object Type 두가지로 나뉜다.
Primitive Type(원시 타입)
원시 값(자료형)이란 객체가 아니면서 메서드 또는 속성도 가지지 않는 데이터이고, 변경 불가능한 값(immutable value)이며 pass-by-value(값에 의한 전달)이다.
원시 값 자체와, 원시 값을 할당한 변수는 다른 개념이다.
변수에 새로운 값을 다시 할당할 수 있지만, 이미 생성한 원시 값은 Object type과 달리 변경할 수 없다.
현 시점에서 원시타입은 다음과 같다.
- string
- number
- boolean
- undefined
- null
- symbol(ES6)
- bigint(ES11)
string
- 문자열을 나타내는 원시 타입
- UTF-16(Unicode Transformation Format) 방식
- UTF-16은 문자 인코딩의 방식으로 보편적으로 utf-8, utf-16이 쓰인다.
- 인코딩은 2bytes(16bits)의 코드 유닛 1개 혹은 2개로 구성(한글, 영문 2bytes)
- 2바이트 문자는 U+0000에서 U+FFFF 범위 내에 있음 - 기본 다국어 평면(Basic Multilingual Plane, BMP)
- 서로게이트 쌍은 UTF-16에서 BMP 범위를 벗어나는 문자를 표현하기 위해 사용 - U+010000에서 U+10FFFF 범위의 문자를 표현
- 문자 1개가 2bytes or 4bytes인데 4bytes경우 인덱스를 사용시 짤림 문제 발생가능(
for of사용하면 방지)
string의 메모리에 관한 생각
js 원시타입은 사용하는 메모리가 고정적이고, 콜 스택에 저장된다.
다른 원시타입들은 사용하는 메모리가 고정인데, 문자열은 글자 수가 4개가 넘으면 8 bytes를 넘어간다.
그래서 문자열이 내부적으로 어떻게 처리되는지 궁금했었는데, C에서는 문자열은 char(한글자)의 배열이다.
js에서도 내부적으로 이 방식으로 돌아간다고 생각한다.
문자열이 내부적으로 char 2 bytes 배열이기에 인덱스로 접근이 가능하고, 인덱스로 접근 시, 4bytes 문자는 짤릴 수 있는 문제가 있는 것이다.
for of로 접근 시, 4bytes 문자 일때 내부적으로 다음 값까지 같이 반환하는 것이다.
js에서 배열은 heap에 저장되는데, 왜 문자열은 call stack 영역에 저장되느냐는 js의 배열은 해시 테이블기반이지만(같은 타입만쓰면 엔진이 최적화가능 아마 벡터?)
문자열은 같은 사이즈를 갖는 고정된 길이의 배열로 확정되기 때문이다. C에서 이 같은 배열은 stack에 저장된다.