TIL04 | JavaScript 데이터 타입과 필요성

2021. 9. 28. 17:51언어/Javascript

반응형

모던 자바스크립트(저자 이웅모), 코어 자바스크립트(저자 정재남) 내용을 참고하였습니다.

 

데이터 타입은 왜 필요한 것일까?

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

 

데이터 타입의 분류

원시타입과 참조타입을 구분하는 기준

  • 원시형은 값이 담긴 주소값을 복제하고, 참조형은 값이 담긴 주소값들로 이루어진 묶음을 가리키는 주소값을 복제한다

원시 타입

  • number, string, boolean, undefined, null, symbol

  • 불변값

    var a = 'abc';
    a = a + 'def';
    • 'abc'가 'abcdef'로 바뀌는 것이 아니라, 새로운 문자열 'abcdef'를 만들어 그 주소를 변수 a 에 저장한다
    • 불변성의 성질: 변경은 새로 만드는 동작을 통해서만 이루어진다

참조 타입

  • Object, Array, Function, Date, RegExp(정규표현식)

  • 가변값

    var a = 10;
    var b = a;
    
    var obj1 = { c:10, d:'ddd' };
    var obj2 = obj1;
    • 참조형 데이터가 '가변값'이라고 설명할 때의 '가변'은 참조형 데이터 자체를 변경할 경우가 아니라 그 내부의 프로퍼티를 변경할 때만 성립한다

 

> number

자바스크립트는 하나의 숫자 타입만이 존재한다.

⇒ 상대적으로 메모리 관리에 대한 압박에서 자유로울 수 있다

var integer = 10; // 정수
var double = 1.1; // 실수
var negative = -20; // 음의 정수

정수, 실수, 2진수, 8진수, 16진수 리터럴은 모두 메모리에 배정밀도 64비트 부동소수점 형식의 2진수로 저장된다.

모든 수를 실수로 처리하며, 정수만 표현하기 위한 데이터타입(integer type)이 별도로 존재하지 않는다.

var binary = 0b01000001; // 2진수
var octal = 0o101; // 8진수
var hex = 0x41; // 16진수

console.log(binary, octal, hex); // 65 65 65

// 숫자타입은 모두 실수로 처리
console.log(1 === 1.0); // true

숫자 타입은 추가적으로 세 가지의 특별한 값도 표현할 수 있다.

  • Infinity : 양의 무한대
  • -Infinity : 음의 무한대
  • Nan : 산술 연산 불가(not-a-number)
console.log(10 / 0); // Infinity
console.log(10 / 0); // -Infinity
console.log(1 * 'string'); // Nan

 

> string

문자열은 0개 이상의 16비트 유니코드 문자의 집합으로 전 세계 대부분의 문자를 표현할 수 있다.

문자열을 따옴표로 감싸지 않으면 자바스크립트 엔진은 키워드나 식별자 같은 토큰으로 인식한다.

문자열 표기 방법

  • 작은 따옴표(' ')
  • 큰 따옴표(" ")
  • 백틱(` `)

템플릿 리터럴 (``)

ES6부터 도입된 템플릿 리터럴은 편리한 문자열 처리 기능을 제공한다.

런타임에 일반 문자열로 변환되어 처리된다.

  • 멀티라인 문자열 제공
  • 표현식 삽입 가능
// template literal
var template = `Hello world!`; 

// 멀티라인 문자열
var multiLine = `Hello
world~`; 

// 표현식 삽입
var first = 'Hello';
var last = 'world';
console.log(`Expression interpolation✨️ ${first} ${last}!`); // Expression interpolation✨️ Hello world!

console.log(`1 + 2 = ${1 + 2}`) // 1 + 2 = 3 => 표현식의 평가결과가 문자열이 아니더라도 문자열로 강제변환

 

> boolean

truefalse 두 가지 값을 가진다.

 

> undefined

undefined 는 개발자가 의도적으로 할당하기 위한 값이 아니라 자바스크립트 엔진이 자동으로 부여하는 값이다.

  1. 값을 대입하지 않은 변수. 즉 데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근할 때
  2. 객체 내부의 존재하지 않는 프로퍼티에 접근할 때
  3. return문이 없거나 호출되지 않는 함수의 실행결과

개발자가 의도적으로 변수에 undefined 를 할당한다면 본래의 취지에 어긋날뿐더러 혼란을 줄 수 있으므로 권장하지 않는다. 변수에 값이 없다는 것을 명시하고 싶을 때는 null을 할당하자.

var foo;
console.log(foo); // undefined

 

> null

null변수에 값이 없다는 것을 의도적으로 명시할 때 사용한다. (의도적 부재)

이는 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미한다.

var foo = 'abc';
foo = null; // 이전 참조를 제거

참고

typeof 연산자로 null 값을 계산해보면 null 이 아닌 ''object''를 반환한다. ⇒ 버그

null 과 undefined 비교

// Equal operator
console.log(null == undefined);   // true

// Strict Equal operator
console.log(null === undefined);  // false

 

> symbol

ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시 타입의 값이다.

 

참조 타입은 추후 작성할 예정.

반응형

'언어 > Javascript' 카테고리의 다른 글

TIL06 | JavaScript 문자열, 숫자 메서드  (0) 2021.09.30
TIL05 | 함수와 함수 호이스팅  (0) 2021.09.30
TIL03 | JavaScrpit 객체  (0) 2021.09.27
TIL02 | JavaScript 배열  (0) 2021.09.27
TIL01 | JavaScrpit 변수  (0) 2021.09.26