[모던 자바스크립트 Deep Dive] 자바스크립트의 데이터 타입

이은지·2025년 1월 30일
0

모던 자바스크립트 6장을 읽고 정리한 글이다.

1. 데이터 타입

1.1 데이터 타입의 정의

  • 데이터 타입은 값의 종류를 말함
  • 자바스크립트의 모든 값은 데이터 타입을 가지며, 자바스크립트는 7개의 타입을 제공(BigInt까지 포함하면 8개)
    • 7개의 타입은 원시 타입(primitive type)과 객체 타입(object/reference type)으로 분류
  • 각 데이터 타입은 확보해야 할 메모리 공간의 크기, 저장되는 2진수, 해석 방식이 다름

1.2 데이터 타입의 필요성

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

2. 숫자 타입

  • C나 자바의 경우 정수와 실수를 구분해서 다양한 숫자 타입을 제공하지만, 자바스크립트는 하나의 숫자 타입만 존재
  • 숫자 타입의 값은 모든 수를 실수로 처리하며 정수만 표현하기 위한 데이터 타입이 별도로 존재하지 않음
  • 정수, 실수, 2진수, 8진수, 16진수 리터럴은 모두 메모리에 배정밀도 64비트 부동소수점 형식의 2진수로 저장되며, 이들 값을 참조하면 모두 10진수로 해석됨
var binary = 0b0100001 //2진수
var octal = 0o101 //8진수
var hex = 0x41 //16진수

//표기법만 다를뿐 모두 같은 값 
console.log(binary) //65
console.log(octal) //65
console.log(hex) //65
  • 숫자 타입은 추가적으로 세 가지 특별한 값도 표현할 수 잇음
    • Infinity: 양의 무한대
    • -Infinity: 음의 무한대
    • NaN: 산술 연산 불가(not-a-number)

3. 문자열 타입

  • 문자열 타입은 텍스트 데이터를 나타내는 데 사용
  • 작은 따옴표(''), 큰따옴표(""), 백틱(``)으로 텍스트를 감쌈
    • 왜?
      • 키워드나 식별자와 같은 토큰과 구분하기 위해서
  • 문자열은 원시 타입이며, 변경 불가능한 값(immutable value)

4. 템플릿 리터럴

  • 일반 문자열과 비슷해 보이지만 백틱(``)을 사용해 표현

4.1 멀티라인 문자열

  • 일반 문자열 내에서는 줄바꿈 등의 공백을 표현하려면 백슬래시로 시작하는 이스케이프 시퀀스를 사용해야함
  • 그러나 템플릿 리터럴 내에서는 이스케이프 시퀀스를 사용하지 않고도 줄바꿈이 허용되며, 모든 공백도 있는 그대로 적용됨

4.2 표현식 삽입

  • 문자열은 문자열 연산자 +를 사용해 연결할 수 있음
  • 템플릿 리터럴 내에서는 표현식 삽입을 통해 간단히 문자열을 삽입 가능
    • 표현식을 삽입하려면 ${}으로 표현식을 감싸 사용
var first = 'Ung-mo';
var last = 'Lee';
// ES6: 표현식 삽입
console.log( My name is ${first} ${last}.); // My name is Ung-mo Lee.

5. 불리언 타입

  • 논리적 참, 거짓을 나타내는 true, false로 구성

6. undefined 타입

  • 개발자가 의도적으로 할당하기 위한 값이 아니라 자바스크립트 엔진이 변수를 초기화할 때 사용하는 값
  • 자바스크립트 엔진이 변수를 초기화할 때 사용하는 undefined를 개발자가 의도적으로 변수에 할당한다면 undefined의 본래 취지와 어긋나고, 혼란을 줄 수 있으므로 권장하지 않음
    • 변수에 값이 없다는 것을 명시하고 싶을 때는 undefiend 대신 null을 할당할 것

7. null 타입

  • 프로그래밍 언어에서 null은 변수에 값이 없다는 것을 의도적으로 명시할 때 사용
  • 변수에 null을 할당 하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미
    • 이는 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미하며, 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행

8. 심벌 타입

  • 심벌은 변경 불가능한 원시 타입의 값으로, 심벌 값은 다른 값과 중복되지 않는 유일무이한 값
  • 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용
  • 심벌은 Symbol 함수를 호출해 생성
  • 이때 생성된 심벌 값은 외부에 노출되지 않으며, 다른 값과 중복되지 않는 유일무이한 값

9. 객체 타입

  • 11장 참조

10. 동적 타이핑

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

  • 정적 타입 언어
    • 변수를 선언할 때 데이터 타입을 사전에 선언
    • 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당할 수 있음
    • 컴파일 시점에 타입 체크를 수행하여 만약 타입 체크를 통과하지 못했다면 에러를 발생시키고 프로그램의 실행 자체를 막음
    • ex: C, C++, 자바, 코틀린, 고, 등
  • 동적 타입 언어
    • 변수 선언 후 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있음
    • 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)되며, 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있음
      • 이러한 특징을 동적 타이핑이라 함
    • ex: 자바스크립트, 파이썬, PHP, 루비, 등

변수는 타입을 가질까?

  • 변수는 타입을 갖지 않음. 값은 타입을 가짐
  • 변수에 할당되어 있는 값에 의해 변수의 타입이 동적으로 결정된다고 표현하는 것이 적절

10.2 동적 타입 언어의 단점

  • 유연성은 높지만 신뢰성이 떨어짐
    • 변수 값은 재할당에 의해 언제든지 변경될 수 있으므로 자바스크립트는 타입을 잘못 예측해 오류가 발생할 가능성이 큼
profile
소통하는 개발자가 꿈입니다!

0개의 댓글