데이터 타입
자바스크립트(ES6)는 기본형과 참조형으로 나뉘는 7개의 데이터 타입을 제공.
- 기본형 데이터 (원시 타입)
- 할당이나 연산 시 복제됨.
- 메모리 저장 시 변수 영역과 데이터 영역을 활용하여 저장.
- 불변성을 띈다 → 재할당 시 저장된 값을 변경 하는 것이 아니라 새로운 데이터를 만든 뒤 그 데이터의 주솟값을 저장함.
1. 숫자 타입 (Number)
- 모든 수를 실수로 처리, 정수만 표현하기 위한 데이터타입이 별도로 존재하지 않음.
- 2진수, 8진수, 16진수를 포현하는 데이터 타입이 없으므로, 이 값들을 참조할 경우 모두 10진수로 해석.
- 숫자 타입은 세 가지 특별한 값도 표현 가능하다.
- Infinity : 양의 무한대
- -Infinity : 음의 무한대
- NaN : 산술 연산 불가 (not-a-number)
2. 문자열 타입 (String)
- 작은따옴표(' '), 큰따옴표(" ") 또는 백틱(` `)으로 텍스트를 감싸 사용. 일반적으로는 작은 따옴표 사용.
- 원시 타입으로서, 변경 불가능한 값이다. (C는 문자의 배열로, 자바는 객체로 문자열을 표현하는 것과 비교했을 때 다르다.)
- 템플릿 리터럴 : ES6부터 도입된 새로운 문자열 표기법으로서, 백틱을 사용해 표현
- 멀티라인 문자열, 표현식 삽입, 태그드 탬플릿 등 편리한 문자열 처리 기능 제공, 런타임에 일반 문자열로 변환되어 처리.
(태그드 탬플릿은 템플릿 리터럴의 표현식을 분해할 수 있는 기능)
3. 불리언 타입 (Boolean)
- 논리의 참, 거짓을 나타내는 true, false 두 가지 뿐이다.
4. undefined 타입 (undefined)
- var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화.
- 개발자가 의도적으로 할당하기 위한 값이 아닌, 자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값.
→ 직접 할당한 undefined는 실존하는 데이터가 되고, 자바스크립트 엔진이 반환하는 경우는 문자 그대로 값이 없음을 나타내는 것. (직접 undefined를 할당하지 않기)
자바스크립트 엔진이 undefined를 반환하는 경우는 총 세가지.
사용자가 당연히 어떤 값을 지정할 것이라고 예상되는 상황임에도 실제로는 그렇게 하지 않을 때.
1. 값을 대입하지 않은 변수
2. 객체 내부의 존재하지 않는 프로퍼티에 접근할 때
3. return 문이 없거나 호출되지 않은 함수의 실행 결과
+ 4. 선언하지 않은 변수를 typeof 연산자로 연산한 경우 undefined 반환
5. null 타입 (null)
- 변수에 값이 없다는 것을 의도적으로 명시, 의도적으로 부재를 나타낼 때 사용.
- 함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 함.
ex) documnet.querySelector 메서드는 HTML 요소를 검색할 수 없는 경우 null을 반환.
- type of null 이 object라는 점을 주의.
6. 심벌 타입 (Symbol)
- 변경 불가능한 원시 타입의 값. 다른 값과 중복되지 않는 유일무이한 값.
- 다른 원시 값은 리터럴을 통해 생성하지만, 심벌은 Symbol 함수를 통해 생성.
- 생성된 심벌은 외부에 노출되지 않음.
- 참조형 데이터 (객체 타입)
- 할당이나 연산 시 참조됨.
- 메모리 저장 시 변수 영역과 객체의 변수 영역, 데이터 영역을 활용하여 저장.
- 가변성을 띈다 → 데이터 영역에 저장된 값은 모두 불변 값이지만, 객체의 변수 영역에는 다른 값을 대입 할 수 있기 때문.
(데이터 자체 변경 시에는 아니고, 그 내부의 프로퍼티를 변경할 경우에만 가변적)
- 예외적으로 불변값으로 활용하는 방법도 있음.
- Array, Function, Date, RegExp, Map, WeakMap, Set, WeakSet
데이터 타입이 필요한 이유?
- 메모리 공간의 확보와 참조를 위해
- 데이터 값의 해석을 위해
자바스크립트는 동적 타입 언어
정적 타입 언어 (static/strong type)
- 명시적 타입 선언,변수를 선언할 때 데이터 타입을 사전에 선언해야 함
- 변수의 타입을 변경할 수 없음
- 컴파일 시점에 타입 체크(올바른 데이터 타입을 사용했는지 확인)를 수행
- C, C++, Java, Kotlin, Go, Haskell, Rust, Scala 등
동적 타입 언어 (dynamic/weak type)
- 변수 선언 시 데이터 타입을 따로 선언하지 않음
- 어떤 데이터 타입의 값도 자유롭게 할당 가능
- 값을 할당하는 시점에 변수의 타입이 동적으로 결정 (타입 추론, type inference)
- JavaScript, Python, PHP, Ruby, Lisp, Perl 등
→ 유연성은 높지만 신뢰성은 떨어짐
출처
- 모던 자바스크립트 Deep Dive - 자바스크립트의 기본 개념과 동작 원리
- 코어 자바스크립트
'JavaScript' 카테고리의 다른 글
[JS] 모던 자바스크립트 - 06. 객체 리터럴 (0) | 2021.08.31 |
---|---|
[JS] 모던 자바스크립트 - 05. 타입 변환과 단축 평가 (0) | 2021.08.29 |
[JS] 모던 자바스크립트 - 04. 제어문 (0) | 2021.08.29 |
[JS] 모던 자바스크립트 - 03. 연산자 (0) | 2021.08.28 |
[JS] 모던 자바스크립트 - 01. 변수, 네이밍 컨벤션, 표현식과 문 (0) | 2021.08.27 |