- 자바스크립트(ES6)는7개의 데이터 타입을 제공한다.
- 7개의 데이터 타입은 원시타입(primitive type)과 객체 타입(object/reference type)으로 분류된다.
1. 숫자 타입 (Number)
- 숫자 타입은 배정밀도 64비트 부동소수점 형식을 따른다
=> 모든 수를 실수로 처리하며, 정수만을 표현하기위한 데이터 타입은 존재하지 않음.
- 자바스크립트는 2,8,16진수를 위한 데이터 타입을 제공하지 않기 떄문에 이들 값을 참조하면 모두 10진수로 해석된다.
- 숫자 타입은 추가적으로 3가지 특별한 값도 표현할 수 있다.
1) Infinity: 양의 무한대
2) -Infinity: 음의 무한대
3) NaN: 산술 연산 불가 (Not a Number)
- 자바스크립트는 대소문자를 구분하기 때문에 NaN의 대소문자를 유의해야 한다.
2. 문자열 타입 (String)
- 문자열은 0개 이상의 16비트 유니코드 문자의 집합(UTF-16)으로 전세계 대부분의 문자가 표현 가능하다.
- 문자열은 '', "", `` 으로 표현 가능하다.
- 문자열을 따옴표로 감싸는 이유는 키워드나 식별자같은 토큰과 구분하기 위해서이다.
3. 템플릿 리터럴
- ES6에서 새로 도입된 문자열 표기법이다.
- ``(백틱) 을 사용해 표현한다.
3.1 멀티라인 문자열
- 일반 문자열 내에서는 줄바꿈이 허용되지 않는다.
- 따라서 문자열 내에서 개행등을 표현하기 위해서는 \로 시작하는 escape sequence를 사용해야 한다
* 라인 피드와 캐리지 리턴
=> 개행 문자에는 Line Feed와 Carriage Return이 있다.
=> LF는 커서를 정지한 상태에서 종이를 한줄 올리는것이다.
=> CR은 커서를 맨 앞으로 이동하는것이다.
=> 초창기에는 CRLF(\r\n)으로 커서를 앞으로 당기고 종이를 한줄 올리는 방식으로 개행했다.
=> 현대의 운영체제는 서로 다른 체계의 개행방식을 사용한다.
=> 윈도우는 CR + LF로 개행하고 유닉스는 LF로 개행한다. (MacOS는 LF를 사용한다)
=> 따라서 서로다른 운영체제에서는 서로의 개행문자를 인식하지 못한다. (그래서 에디터가 자동변환해준다.)
=> JS에서는 일반적으로 라인피드를 사용해 개행한다.
- `` 백틱을 이용하면 템플릿 리터럴 내에서는 이스케이프 시퀀스를 사용하지 않고도 개행이 허용된다.
3.2 표현식 삽입
- 템플릿 리터럴 내에서는 ${표현식} 을 사용하므로서 표현식의 평가 결과가 문자열타입으로 강제 변환되어 삽입된다.
4. 불리언 타입 (Boolean)
- 참 거짓을 나타내는 true와 false로 구성되어 있다.
5. undefined
- var키워드로 선언한 변수는 암묵적으로 undefined로 초기화 된다.
- 변수에 값이 없다는것을 명시하고 싶을때는 null을 할당한다.
6. null 타입
- 변수에 값이 없다는 것을 의도적으로 명시할 때 사용한다.
- 이전에 할당되어 있던 값을 제거하는것을 의미한다.
- 함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 한다.
7. symbol 타입
- ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시타입이다.
- 다른 값과 중복되지 않는 유일한 값이다.
- 심볼 이외의 원시값은 리터럴을 통해 생성되지만, 심볼은 Symbol함수를 호출해 생성된다.
8. 객체 타입
- 원시타입을 제외한 거의 모든것은 객체 타입이다.
9. 데이터 타입의 필요성
9.1 데이터 타입에 의한 메모리 공간의 확보와 참조
- 자바스크립트 엔진은 데이터 타입에 따라 정해진 크기의 메모리 공간을 확보한다.
- 식별자를 통해 값이 저장되어있는 메모리 공간의 선두 메모리셀 주소를 찾아갈 수 있다.
- 선두로부터 한번에 읽어 들여야 할 메모리 셀의 개수를 알아야 한다.
- 이를 알려주는것이 자료형이다(숫자 타입은 8바이트이기 때문에 한번에 8셀을 읽는다)
9.2 데이터 타입에 의한 값의 해석
- 메모리 셀에 저장되어 있는 것은 2진수 뿐이다.
- 2진수는 어떻게 읽냐에 따라 문자도, 숫자도 해석할 수 있다.
- 이를 데이터 타입이 알려줘 원하는 모습으로 해석하게 된다
- 데이터 타입이 필요한 이유
1) 값을 저장할때 확보해야하는 메모리 공간의 크기를 결정하기 위함.
2) 값을 참조할 때 한번에 읽어야 하는 메모리 공간의 크기를 결정하기 위함.
3) 메모리에서 읽은 2진수를 어떻게 해석할지 결정하기 위함.
10. 동적 타이핑
10.1 동적 타입 언어와 정적 타입 언어
- C나 자바같은 정적 타입 (Strong/static type)언어는 변수를 선언시 할당할 값의 종류를 사전에 선언해야 한다.
- 이를 명시적 타입 선언이라고 한다.
- 정적 타입 언어는 변수의 타입을 변경할 수 없다.
- 정적 타입 언어는 컴파일 시점에 타입 체크를 수행한다.
- 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)된다.
- 그리고 언제든지 재할당에 의해 타입이 변할 수 있다.
- 이런 특징을 동적 타이핑이라고 하며, 동적 타입 언어라 한다. (JS, Python, PHP, Ruby, Lisp etc...)
- 변수는 타입을 갖지 않는다. 값은 타입을 갖는다.
10.2 동적 타입 언어와 변수
- 동적 타입 언어는 유연성은 높지만 신뢰성은 떨어진다.
- 이러한 이유로 변수를 사용할 때 데이터 타입을 체크해야 하는 경우가 있다 -> 번거로움과 코드의 가독성 손실
- 변수를 사용할 때 주의사항
1) 변수는 꼭 필요한 경우에 제한적으로 사용한다.
=> 변수의 개수가 많을수록 타입을 잘못 예측해 오류가 발생할 확률이 크기 때문
2) 변수의 유효 범위(스코프)는 최대한 좁게 만들어 변수의 부작용을 억제해야 한다.
3) 전역 변수는 최대한 사용하지 않는다.
=> 전역 변수는 프로그램의 복잡성을 증가시키고, 처리 흐름을 추적하기 어렵게 만든다.
4) 변수보다는 상수를 사용해 값의 변경을 억제한다.
5) 변수의 이름은 목적이나 의미를 파악할 수 있도록 네이밍한다.
- 컴퓨터가 이해하는 코드는 바보도 쓸 수 있다. 하지만 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 쓴다 -
마틴 파울러 <<리팩토링>>의 저자
'JS > [책] 모던 자바스크립트 Deep Dive' 카테고리의 다른 글
8. 제어문 (0) | 2021.08.18 |
---|---|
7. 연산자 (0) | 2021.08.18 |
5. 표현식과 문 (0) | 2021.08.17 |
4. 변수 (0) | 2021.08.16 |
3. 자바스크립트 개발 환경과 실행 방법 (0) | 2021.08.16 |