06 데이터 타입

연우·2024년 11월 6일
0
  • 자바스크립트의 모든 값은 데이터 타입을 갖는다.

  • 자바스크립트는 7개의 데이터 타입을 가지며 원시 타입과 객체 타입으로 분류한다.

  • 원시 타입
    - 숫자 타입 : 숫자. 정수와 실수 구분없이 하나의 숫자 타입만 존재
    - 문자열 타입 : 문자열
    - 불리언 타입 : 논리적 참(true)과 거잣(false)
    - undefined 타입 : var 키워드로 선언된 변수에 암묵적으로 할당되는 값
    - null 타입 : 값이 없다는 것을 의도적으로 명시할 때 사용하는 값
    - 십벌 타입 : ES6에서 추가된 7번째 타입

  • 객체 타입
    - 객체, 함수, 배열 등

  • 데이터 타입마다 메모리 공간의 크기, 저장되는 2진수, 해석하는 방식이 달라진다.

    6.1 숫자 타입

  • C나 자바의 경우 정수와 실수를 구분해서 int, long, float, double 등과 같은 다양한 숫자 타입을 제공

  • 자바스크립트는 하나의 숫자 타입만 존재

  • ECMAScript 사양에 따르면 숫자 타입의 값은 배정밀도 64비트 부동소수점 형식을 따름

  • 즉, 모든 수를 실수로 처리하며, 정수만 표현하기 위한 데이터 타입 존재하지 않음

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

  • 자바스크립트는 2진수, 8진수, 16진수를 표현하기 위한 데이터 타입을 제공하지 않기 때문에 참조하면 모두 10진수로 해석

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

console.log(bainaty); // 65;
console.log(octal); //65
  • 정수로 표시되도 사실은 실수

  • 숫자 타입은 추가적으로 세 가지 특별한 값도 표현
    - Infinity : 양의 무한대
    - -Infinity : 음의 무한대
    - NaN : 산술 연산 불가

    6.2 문자열 타입

  • 문자열 타입은 텍스트 데이터를 나타내는 데 사용

  • 0개 이상의 16비트 유니코드 문자(UTF-16)의 집합으로 전 세계의 대부분 문자를 표현

  • 문자열은 작은 따옴표(''), 큰따옴표(""), 백틱(``)으로 텍스트를 감싼다.

  • 따옴표로 감싸는 이유는 키워드나 식별자 같은 토큰과 구분하기 위해서이다.

  • 감싸지 않으면 토큰으로 인식

  • C는 문자열 타입을 제공하지 않고 문자의 배열로 표현하고, 자바는 문자열을 객체로 표현

    6.3 템플릿 리터럴

  • ES6부터 템플릿 리터럴 도입

  • 멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능 제공

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

  • 템플릿 리터럴은 일반적인 따옴표 대신 백틱(``)을 사용해 표현

    6.3.1 멀티라인 문자열

  • 일반 문자열 내에서는 줄바꿈(개행)이 허용되지 않는다

  • 줄바꿈 등의 공백(white space)을 표현하려면 백슬래시로 시작하는 이스케이프 시퀀스를 사용해야한다.

  • 이스케이프 스퀀스
    - \0 : null
    - \b : 백스페이스
    - \f : 폼피드, 프린터로 출력할 경우 다음 페이지의 시작 지점으로 이동한다
    - \n : 개행, 다음행으로 이동
    - \r : 개행, 처음으로 이동
    - \t : 탭(수평)
    - \v : 탭(수직)
    - \uXXXX : 유니코드, 예를 들어 '\u0041' 은 'A'
    - \' : 작은따옴표
    - \" : 큰따옴표
    - ` : 백슬래시

    6.3.2 표현식 삽입

  • 문자열은 문자열 연산자 +를 사용해 연결할 수 있다.

  • + 연산자는 피연산자 중 하나 이상이 문자열인 겨우 문자열 연결 연산자로 동작(그 외의 경우 덧셈 연산자)

var first = 'Ung-mo';
var last = 'Lee';

//ES5 : 문자열 연결
console.log('My name is' + first + '' + last + '.')  // My name is Ung-mo Lee.
  • 템플릿 리터럴 내에서는 표현식 삽입을 통해 간단히 문자열을 삽입할 수 있다
var first = 'Ung-mo';
var last = 'Lee';

//ES5 : 표현식 삽입
console.log(`My name is ${first} ${last}.`) // My name is Ung-mo Lee.

6.4 불리언 타입

  • 불리언 타입의 값은 논리적 참, 거짓을 나타내는 true와 false뿐이다.

6.5 undefined 타입

  • undefined 타입의 값은 undefined가 유일하다
  • var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화
  • 변수를 선언한 이후 값을 할당하지 않은 변수를 참조하면 undefined 반환
  • 개발자가 의도적으로 할당하기 위한 값이 아닌 자바스크립트 엔진이 변수를 초기화할 때 사용하는 값
  • 개발자가 의도적으로 변수에 할당하는 것은 본래 취지에 어긋남
  • 변수에 값이 없다는 것을 명시하고 싶을때는 null을 사용

6.6 null 타입

  • null 타입의 값은 null 유일
  • 변수에 값이 없다는 것을 의도적으로 명시할 때 사용
  • 변수에 null을 할당하는 것은 변수가 이전에 참조한던 값을 더 이상 참조하지 않겠다는 의미
  • 자바스크립트 엔진은 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행
  • 함수가 유효한 값은 반환할 수 없는 경우 명시적으로 null을 반환하기도 한다.

6.7 심벌 타입

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

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

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

6.8 객체 타입

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

6.9 데이터 타입의 필요성

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

  • 값은 메모리에 저장하고 참조할 수 있어야함
  • 몇 바이트의 메모리 공간을 사용해야 낭비와 손실 없이 값을 저장할 수 있는지 알아야함
var score = 100;
  • 위 코드가 실행되면 컴퓨터는 숫자 값 100을 저장하기 위해 메모리 공간을 확보, 숫자 값 100을 2진수로 저장
  • 자바스크립트 엔진은 데이터 타입, 즉 값의 종류에 따라 정해진 크기의 메모리 공간을 확보
  • 변수에 할당되는 값의 데이터 타입에 따라 확보해야 할 메모리 공간의 크기가 결정된다.
  • 위 예제의 경우 자바스크립트 엔진은 리터럴 100을 숫자 타입의 값으로 해석, 저장하기 위해 8바이트의 메모리 공간을 확보하고 100을 2진수로 저장
  • 식별자 score를 통해 저장되어 있는 메모리 공간의 주소를 찾아갈 수 있다.
  • 이때 값을 참조하려면 한 번에 읽어 들여야 할 메모리 공간의 크기, 메모리 셀의 개수(바이트 수)를 알아야 한다.
  • score 변수의 경우 저장되어 있는 값이 숫자 타입이므로 8바이트 단위로 읽어 들이지 않으면 값이 훼손
  • score 변수는 숫자 타입의 값이 할당되어 있으므로 자바스크립트 엔진은 score 변수를 숫자타입으로 인식해 8바이트 단위로 읽어들임

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

  • 메모리에서 읽어 들인 2진수를 어떻게 해석해야 하느냐
  • 메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있다.
  • score 변수에 할당된 값은 숫자 타입의 값으로 2진수를 숫자로 해석
    지금까지 살펴본 데이터 타입인 필요한 이유

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

6.10 동적 타이핑

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

  • C나 자바 같은 정적 타입 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다
  • 이를 명시적 타입 선언이라 한다.
  • 변수의 타입을 변경할 수 없고 타입에 맞는 값만 할당할 수 있다.
  • 컴파일 시점에 타입체크를 수행 통과하지 못하면 에러를 발생 실행 자체를 막는다.
  • C, C+, Java, Go, Rust, Scala 등이 있다.
char c;
int num;
  • 자바스크립트는 변수를 선언할 때 타입을 선언하지 않음
  • var, let, const 키워드를 사용해 변수 선언
  • 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.
  • typeof 연산자는 연산자 뒤에 위치한 피연산자의 데이터 타입을 문자열로 변환
var foo = 3;
console.log(typeof foo); // number
  • 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)된다.
  • 재할당에 의해 변수의 타입은 언제든지 동적으로 변하며 이러한 특징을 동적 타이핑이라 한다.
  • 동적 타입 언어 : 자바스크립트, 파이썬, PHP, 루비, 리스프 펄 등

6.10.2 동적 타입언어와 변수

  • 변수 값은 언제든지 변경될 수 있기 때문에 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울 수 있다.
  • 동적 타입 언어의 변수는 값의 변경에 의해 타입도 언제든지 변경될 수 있다,
  • 동적 타입 언어의 변수는 값을 확인하기 전에는 타입을 확신할 수 없다.
  • 더욱이 개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 타입이 자동으로 변환되기도 한다.
  • 동적 타입 언어는 유연성은 높지만 신뢰성을 떨어진다.
  • 이러한 이유로 변수를 사용하기 이전에 테이터 타입을 체크해야하는 경우도 있다.

변수를 사용할 때 주의할 사항

  • 변수는 꼭 필요한 경우에 한해 제한적으로 사용
  • 변수의 유효 범위는 최대한 좁게 만들어 부작용 억제
  • 전역 변수는 최대한 사용하지 않는다
  • 변수보다는 상수를 사용해 값의 변경을 억제
  • 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍

0개의 댓글