본문 바로가기
Books/모던 JS Deep Dive ✔️

[모던 JS Deep Dive] 6장 - 데이터 타입

by Aaron-Kim 2021. 12. 8.

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 (프로그램의 복잡성 증가, 처리 흐름 추적 어려움, 오류 원인 특정하기 어려움)

   - 변수보다는 상수를 사용해 값의 변경 억제

   - 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍 (존재 이유 파악 가능하도록 네이밍)

 - 가독성이 좋은 코드가 좋은 코드임

반응형

댓글