본문 바로가기
개발서적/모던 자바스크립트 Deep Dive

데이터 타입 (모던 자바스크립트 Deep Dive)

by 사과넹 2024. 4. 15.
반응형

자바스크립트(ES6)의 타입 원시 타입 6개

  • number : 숫자 (정수 + 실수)
  • string
  • boolean : true, false
  • undefined
  • null : 값이 없음
  • symbol

객체 타입 1개

  • object : 객체, 함수, 배열 등

자바스크립트(ES11)

  • BigInt : 2의 53승 -1 보다 큰 정수를 표현할 때 사용

 

  • 타입에 따라 확보할 메모리 공간과 메모리에 저장되는 2진수도 다르며 해석하는 방식도 다르기 때문에 명확한 의도를 가지고 타입을 가진 값을 사용해야 한다.

 

6.1 숫자 타입

  • C 또는 Java의 경우, 정수와 실수를 구분한 여러 숫자 타입이 존재한다.
    • int, long, float, double …
  • ECMAScirpt 사양 상, 자바스크립트는 모든 수를 실수 처리하며 정수만 표현하기 위한 타입은 없다.
❓ 자바스크립트의 숫자 타입은 배정밀도 64비트 부동소수점 형식을 따른다.

 

  • 자바스크립트는 2진수, 8진수, 16진수를 표현하기 위한 데이터 타입이 없기 때문에 이 값들을 참조시에는 모두 10진수로 해석된다. (example code)
  • 또 다른 숫자 타입 (example code)
    • Infinity : 양의 무한대
    • -Infinity : 음의 무한대
    • NaN : 산술 연산 불가
      • 대소문자를 구별하니 표현에 주의!

 

6.2 문자열 타입

  • 텍스트 데이터, 16비트 유니코드 문자의 집합
  • single quote ‘’ , double quote “” , backtick ```` 으로 텍스트를 감싼다.
    • backtick : ES6 이후 사용 가능
  • 작은 따옴표로 감싼 문자열 내의 큰 따옴표는 문자열로 인식, 그 반대도 해당된다.
  • 따옴표로 감싸지 않으면 문자열로 인식하지 않고 식별자로 인식된다.
    • 따라서 따옴표로 감싸지 않은 텍스트는 공백 문자를 포함 시킬 수 없다.
  • 자바스크립트에서 문자열은 원시 타입이며 변경 불가능 하다. → immutable value

다른 언어에서는?

  • C : 문자열 타입 제공하지 않고, 문자의 배열로 문자열을 표현
  • Java : 문자열을 객체로 표현
❓ 문자의 배열? ex) char name[20] = “hello, world!”;

 

6.3 템플릿 리터럴

  • ES6부터 도입된 문자열 표기법이며 아래의 세 가지를 제공한다.
    • 멀티라인 문자열
    • 표현식 삽입
    • 태그드 템플릿
  • backtick ``을 사용한다.

 

6.3.1 멀티라인 문자열

  • 일반 문자열에서는 줄바꿈이 허용되지 않아 줄바꿈같은 공백 표현은 백슬래시 \\로 시작하는 이스케이프 시퀀스를 사용해야한다.
  • 템플릿 리터럴 내에서는 이스케이프 시퀀스 사용 없이 줄바꿈이 허용되며 모든 공백도 있는 그대로 적용된다. → 텍스트로 입력한 그대로 표시된다.

 

6.3.2 표현식 삽입

  • 문자열은 문자열 연산자 + 를 통해 연결이 가능하다.
  • 이 연산자는 피연산자 중 하나가 문자열이면 연결 연산자로 동작하며 그 외에는 덧셈으로 표현된다.
  • 문자열인 식별자를 표현식으로 삽입하려면 ${}로 감싼다.
    • 이 방법은 해당 식별자의 값이 문자열이 아니더라도 문자열로 타입이 강제 변환된다.
var first = 'Kim';
var second = 'Jiyeon';

console.log(`My name is ${first} ${second}.`);
// My name is Kim Jiyeon.

 

6.4 불리언 타입

  • 참 true, 거짓 false

 

6.5 undefined 타입

  • var 키워드로 선언한 변수는 암묵적 undefined로 초기화된다.
  • 할당되지 않고 초기화만 된 변수를 참조한다면 undefined가 표현될 것이다.
  • 참조시 undefined가 표현되면 해당 변수의 값이 할당되지 않은 것으로 인식할 수 있으므로 값이 없음을 나타내려면 개발자는 값에 undefined대신 null을 할당해야한다.

 

6.6 null 타입

  • null 타입에는 null밖에 없다.
  • 의도적으로 값이 없음을 명시한다.
  • 이전에 값이 있던 식별자에 null을 할당한다면 더 이상 해당 변수를 참조하지 않는다는 의미로 자바스크립트 엔진은 해당 메모리 공간에 대해 가비지 콜렉터를 수행할 것이다.
  • 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환할 수 있다.

 

6.7 심벌 타입

  • 변경이 불가능한 원시 타입의 값
  • 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용
    • 다른 값과 절대 중복되지 않는 유일무이한 값
  • Symbol()을 통해 호출

 

6.8 객체 타입

  • 자바스크립트는 객체 기반의 언어이며 자바스크립트의 거의 모든 것은 객체이다!

 

6.9 데이터 타입의 필요성

 

6.9.1 데이터 타입에 의한 메모리 공간의 확보와 참조

  • 값은 메모리에 저장하고 참조할 수 있어야 한다.
  • 자바스크립트 엔진은 데이터 타입에 따라 확보해야할 메모리 공간의 크기를 결정한다.
  • 타입에 따라 값을 2진수로 저장하고, 참조를 할 때는 타입에 따라 읽어오는 셀의 개수, 즉 메모리 공간 단위가 결정된다.

 

6.9.2 데이터 타입에 의한 값의 해석

  • 메모리에 저장되는 값들은 모두 2진수로 이루어져 있고, 같은 2진수라도 타입에 따라 읽어오는 값이 다른 것을 염두해야 한다.

 

타입의 필요성 정리

  • 값을 저장할 때 확보해야하는 메모리 공간의 크기를 결정하기 위해
  • 값을 참조할 때 한 번에 읽어들여야 할 메모리 공간의 크기를 결정하기 위해
  • 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해

 

6.10 동적 타이핑

 

6.10.1 동적 타입 언어와 정적 타입 언어

  • 정적 타입 언어
    • C, C++, Java, Kotilin, Go, Haskell, Rust, Scala 등
    • 변수 선언 시에 데이터 타입을 사전에 선언해야 한다. → 명시적 타입 선언
    • 변수 타입 변경 불가
    • 컴파일 시점에 타입 체크 → 미통과시 에러 발생
  • 동적 타입 언어
    • Javascript, Python, PHP, Ruby, Lisp, Perl 등
    • 변수 선언시 var, let, const를 이용하며 변수에 값을 할당 시에 타입이 결정된다.
    • 동적으로 타입 변환이 가능하다.

 

6.10.2 동적 타입 언어와 변수

  • 변수의 데이터 타입을 자유롭게 변환할 수 있지만 단점도 있다.
    • 변수의 값을 확인하기 전에는 타입을 확신할 수 없다.
    • 개발자의 의도와 관계없이 자바스크립트 엔진에 의해 타입이 자동 변환될 가능성이 있다.
    • 즉, 유연성은 높지만 신뢰성은 떨어진다.

 

변수 사용시 주의 사항

  • 변수는 꼭 필요한 경우, 제한적으로 사용하자. 쓸데없는 변수 남발 금지!
  • 변수의 유효 범위(스코프)를 좁게 만들어 변수 부작용을 줄이자.
  • 전역 변수는 최대한 사용 하지 말자. 다른 코드에 영향을 줄 수 있고, 흐름 추적이 어려워진다.
  • 값의 변경을 막기 위해 변수보다 상수를 사용하자.
  • 변수의 목적이나 의미를 파악할 수 있도록 네이밍에 신경쓰자.

 

컴퓨터가 이해하는 코드는 어떤 바보도 쓸 수 있다. 하지만 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 쓴다.
- 마틴 파울러, <리팩토링> 저자

728x90
반응형