6.0 데이터 타입
- 값의 종류
- 모든 값은 데이터 타입을 가짐
- 원시 타입: 변경 불가능한 값 (Immutable)
- 숫자 타입: 실수, 정수 구분 X
- 문자열 타입
- 불리언 타입: true, false
- undefined 타입
- null 타입: 값 없다는 것을 의도적으로 명시
- Symbol 타입
- 객체 타입: 객체, 함수, 배열 등
6.1 숫자 타입
- 하나의 숫자 타입만 존재
- 배정밀도 64비트 (8 바이트) 부동 소수점 형식 따름, 모든 수를 실수로 처리
- 정수로 표시된다고 해도 사실은 실수임
- 세 가지 특별한 값
- Infinity: 양의 무한대
- -Infinity: 음의 무한대
- NaN: 산술 연산 불가 (Not a Number)
- 대소문자 구별 (Case-sensitive)
6.2 문자열 타입
- 텍스트 데이터 나타내기 위한 용도
- 16비트 유니코드 문자의 집합인 UTF-16로 전 세계 대부분 문자 표현 가능
- 작은 따옴표, 큰 따옴표, 백틱(ES6) 이용
- 키워드나 식별자 같은 토큰과 구분 위해 따옴표 사용
6.3 템플릿 리터럴
- multi-line string, expression interpolation, tagged template 등 편리한 문자열 처리 기능 제공
- 런타임에 일반 문자열로 변환되어 처리됨
- 백틱 사용
- 이스케이프 시퀀스
- \0: Null
- \b: 백스페이스
- \n: 라인 피드 (개행, 다음 행으로 이동)
- \r: 캐리지 리턴 (개행, 커서를 처음으로 이동)
- 표현식 삽입
- `${ }`
- 표현식의 평가 결과가 문자열로 강제 타입 변환됨
6.4 불리언 타입
- true, false
- 프로그램 흐름 제어하는 조건문에서 자주 사용됨
6.5 undefined 타입
- var 키워드로 선언한 변수는 JS 엔진에 의해 암묵적으로 undefined로 초기화됨
- 개발자가 의도적으로 undefined로 값 초기화 권장 X => null 할당 이용!
- 선언 vs. 정의
- 선언: 컴파일러에게 식별자의 존재만 알리는 것
- 정의: 컴파일러가 변수를 생성해서 식별자와 메모리 주소가 연결된 것
- JS의 경우, 변수 선언 시 암묵적으로 정의가 이루어짐
- 변수 선언, 함수 정의
6.6 null 타입
- 변수에 값이 없다는 것을 의도적으로 명시 (의도적 부재, intentional absence)할 때 사용
- 변수에 null 할당 => 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미
- 함수가 유효한 값을 반환할 수 없을 때 명시적으로 null 반환하기도 함
- ex) document.querySelector() 에러 => null 반환
6.7 심벌 타입
- 외부에 노출되지 않고 다른 값과 중복되지 않는 유일무이한 값
- 주로 이름 충돌 위험이 없는 객체의 유일한 프로퍼티 키 만들기 위해 사용
- Symbol 함수를 호출해서 생성함
6.8 객체 타입
- JS를 이루고 있는 거의 모든 것이 객체임
6.9 데이터 타입의 필요성
- 데이터 타입에 의한 메모리 공간의 확보와 참조
- JS 엔진이 데이터 타입에 따라 정해진 크기의 메모리 공간을 확보함
- 숫자 타입은 8바이트 단위로 저장됨
- 데이터 타입에 의한 값의 해석
- 데이터 타입이 필요한 3가지 이유
- 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
- 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
- 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해
6.10 동적 타이핑
- 동적 타입 언어 vs. 정적 타입 언어
- 동적 타입 언어 (dynamic/weak type)
- ex) JS, Python, PHP, Ruby, Lisp, Perl, ...
- 변수 선언 시 타입 선언 X
- 어떠한 데이터 타입의 값이라도 자유롭게 변수에 할당 가능
- 변수 타입 자유롭게 변경 가능
- 변수가 선언이 아닌 할당에 의해 타입이 결정됨 (타입 추론, type inference)
- 재할당에 의해 변수 타입은 언제든지 동적으로 변할 수 있음 (동적 타이핑)
- 변화하는 변수 값 추적하기 어려울 수 있음
- 값을 확인하기 전에 타입 확신 불가
- 유연성은 높지만 신뢰성이 떨어짐 (편리하지만 위험함)
- 정적 타입 언어 (static/strong type)
- ex) C, C++, Java, Kotlin, Go, Haskell, Rust, Scala, ...
- 변수 선언 시 데이터 타입을 사전에 선언해야 함 (명시적 타입 선언, explicit type declaration)
- 변수 타입 변경 불가
- 컴파일 시점에 타입 체크 수행 (선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)
- 타입의 일관성 강제 => 안정적인 코드 구현, 런타임에 발생하는 에러 감소
- typeof 연산자: 피연산자의 데이터 타입을 문자열로 반환
- 변수 사용시 주의 사항
- 변수는 꼭 필요한 경우에 제한적으로 사용 (변수의 무분별한 남발 금물)
- 변수의 스코프 (유효 범위)를 최대한 좁게 만들어 변수의 부작용 억제
- 전역 변수 최대한 사용 X (프로그램의 복잡성 증가, 처리 흐름 추적 어려움, 오류 원인 특정하기 어려움)
- 변수보다는 상수를 사용해 값의 변경 억제
- 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍 (존재 이유 파악 가능하도록 네이밍)
- 가독성이 좋은 코드가 좋은 코드임
'Books > 모던 JS Deep Dive ✔️' 카테고리의 다른 글
[모던 JS Deep Dive] 8장 - 제어문 (0) | 2021.12.09 |
---|---|
[모던 JS Deep Dive] 7장 - 연산자 (0) | 2021.12.09 |
[모던 JS Deep Dive] 5장 - 표현식과 문 (0) | 2021.12.07 |
[모던 JS Deep Dive] 4장 - 변수 (0) | 2021.12.07 |
[모던 JS Deep Dive] 3장 - 자바스크립트 개발 환경과 실행 방법 (0) | 2021.12.07 |
댓글