본문 바로가기

Javascript/모던 자바스크립트 DeepDive

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

데이터 타입 종류

  • 데이터 타입 data type은 값의 종류를 뜻함
  • 자바스크립트의 모든 값은 데이터 타입을 갖음
  • ES6는 7개의 데이터 타입을 제공하며, 각 타입은 원시 타입 primitive type과 객체 타입 object/reference type으로 분류
구분 데이터 타입 설명 
원시 타입 숫자 number 숫자, 정수와 실수 구분 없이 하나의 숫자 타입만 존재
문자열 string 문자열
불리언 boolean 논리적 참(true)과 거짓(false)
undefined var 키워드로 선언된 변수에 암묵적으로 할당되는 값
null 값이 없다는 것을 의도적으로 명시할 때 사용되는 값
심벌 symbol 다른 값과 중복되지 않는 유일무이한 값. ES6에서 추가
객체 타입 객체, 함수 배열 등

숫자 number 타입

  • 자바스크립트는 하나의 숫자 타입만 존재 / 자바나 c는 int, long, float, double 등 정수와 실수로 타입을 구분함
  • ECMAScript 사양에 따르면 숫자 타입의 값은 배정밀도 64비트 부동소수점 형식
  • 즉, 모든 수를 실수로 처리하며, 정수만 표현하기 위한 데이터 타입 interger type이 별도로 존재 x
  • 숫자 타입은 추가적으로 세 가지 특별한 값도 표현할 수 있음
    • Infinity: 양의 무한대
    • -Infinity: 음의 무한대
    • NaN: 산술 연산 불가 not-a-number
// 숫자 타입은 모두 실수 처리
console.log(1 === 1.0); // true
// 숫자 타입의 세 가지 특별한 값
console.log(10 / 0); // Infinity
console.log(-10 / 0); // -Infinity
console.log(1 * 'String') // NaN

문자열 string 타입

  • 텍스트 데이터를 나타내는데 사용
  • 0개 이상의 16비트 유니코드 문자( UTF-16)의 집함으로 전세계의 대부분 문자 표현 가능
  • 작은따옴표(' '), 큰따옴표(" "), 백틱(` `) 사용, 일반적으로는 작은따옴표 사용
  • 자바스크립트의 문자열은 원시 타입이며, 변경 불가능한 값 immutable value

템플릿 리터럴 template literal

  • ES6부터 도입
  • 멀티라인 문자열 multi-line string, 표현식 삽입 expression interpolation, 태그드 템플릿 tagged template 등 편리한 문자열 처리 기능 제공
  • 템플릿 리터럴은 일반적인 따옴표가 아닌 백틱(` `)사용

멀티라인 문자열

  • 일반적인 문자열 내에서는 줄바꿈이 허용되지 않음
  • 일반적인 문자열 내에서 줄바꿈을 표현하기 위해서는 백슬레쉬(\)로 시작하는 이스케이프 시퀀스 escape sequence를 사용해야 함
  • 템플릿 리터럴 내에서는 이스케이프 시퀀스 사용하지 않고 줄바꿈이 허용되며, 모든 공백도 그대로 적용됨
// template1과 template2의 출력 결과는 같다
var template1 = '<ul>\n\t<li><a href="##>Home</a></li>\n</ul>';

var template2 = `<ul>
	<li><a href="##>Home</a></li>
</ul>
`

표현식 삽입

var first = "Hongyeop";
var last = "Jin";

// ES6 표현식 삽입
console.log(`My name is ${first} ${last}.`)

불리언 타입

  • 논리적 참, 거짓을 나타내는 true와 false만 존재
  • 프로그램의 흐름을 제어하는 조건문에서 많이 사용됨

undefined 타입

  • var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화
  • 개발자가 의도적으로 할당을 위한 값이 아닌, 자바스크립트 엔진이 변수를 초기화할 때 사용되는 값
  • 의도적으로 갓이 없다는 것을 명시하기 위해서는 null 사용

null 타입

  • 변수에 값이 없다는 것을 의도적으로 명시(의도적 부재 intentional absence)할 때 사용
  • 함수에서 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 함
var elemnet = document.querySelector('.myClass');

console.log(element); // null

심벌 타입

  • ES6에서 추가된 7번째 타입
  • 변경 불가능한 원시 타입의 값
  • 심벌 값은 다른 값과 중복되지 않은 유일무이한 값
  • 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해서 사용
// 심벌 값 생성
var key = Symbol('key');
console.log(typeof key); // symbol

// 객체 생성
var obj = {};

// 이름이 충돌할 위험이 없는 유일무이한 값이 심벌을 프로퍼티 키로 사용
obj[key] = 'value';
console.log(obj[key]); // value

객체 타입

  • 자바스크립트는 객체 기반의 언어
  • 자바스크립트를 이루고 있는 거의 모든 것이 객체

데이터 타입의 필요성

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

동적 타이핑

정적 타입 언어 static/strong type

  • C, C++, java, kotlin, go, haskell, rust, scala
  • 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 함, 이를 명시적 타입 선언 explicit type declaration이라고 함
  • 변수의 타입을 변경할 수 없으며, 변수 선언한 타입에 맞는 값만 할당 가능
  • 컴파일 시점에 타입 체크 수행, 타입 체크를 통과 실패 시 에러 발생
  • 타입의 일관성을 강제하여 안정적인 코드의 구현을 통해, 런타임에서 발생하는 에러를 줄임

동적 타입 언어dynamic/weak type인 javascript 

  • 변수를 선언할 때 타입 선언 x, 키워드(var, let, const)를 사용해 변수 선언
  • 어떤 데이터 값이라도 자유롭게 선언 가능
  • 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론 type inference) 됨
  • 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있음. 이를 동적 타이핑 (dynamic typing)이라고 함
  • 동적 타입 언어는 유연성은 높지만 신뢰성은 떨어짐
  • 다른 동적 타입 언어로는 python, PHP, ruby, lisp, perl

변수 사용 시 주의사항

  • 변수는 꼭 필요한 경우에 한해 제한적으로 사용하고 최소한으로 유지
  • 변수의 유효 범위(스코프)를 최대한 좁게
  • 전역 변수 사용 최대한 지양
  • 변수보다는 상수
  • 변수의 이름은 목적이나 의미를 알 수 있도록 신중히
  • 가독성이 좋은 코드가 좋은 코드