[자바스크립트 핵심 개념] 데이터 타입

Deong_gu·2023년 10월 21일
0
post-custom-banner

자바스크립트의 모든 값은 데이터 타입을 갖는다'

데이터 타입 - 값의 종류

값 - 표현식이 평가되어 생성된 결과
평가 - 식을 해석해서 값을 생성하거나 참조하는 것
표현식 - 값으로 평가될 수 있는
문 - 프로그램을 구성하는 기본 단위이자 최소 실행 단위
(문의 집합 - 프로그램, 문을 작성하고 순서에 맞게 나열하는 것 - 프로그래밍)


데이터 타입의 종류 - 기본형, 참조형

기본형은 값이 담긴 주솟값을 바로 복제하는 반면 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다는 점이 다릅니다.

기본형 - Number, String, Boolean, null, undefined, Symbol

Number(숫자 타입)

  • 배정밀도 64비트 부동소수점 형식의 2진수로 저장
  • 정수와 실수 구분없이 하나의 숫자타입만 존재
  • Infinity, -Infinity, NaN(산술연산불가)

String(문자열 타입)

  • 0개 이상의 16비트 유니코드(UTF-16)의 집합

Boolean(불리언 타입)

  • true, false

null(널 타입)

  • 값이 없다는 것을 의도적으로 명시할 때 사용하는 값
  • 함수가 유효한 값을 반환할 수 없는 경우 명시적으로 반환
  • 변수에 null을 할당하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미(이전에 할당되어 있던 값에 대한 참조 명시적 제거)

undefined

  • 선언된 변수에 암묵적으로 할당되는 값
  • 값을 대입하지 않은 변수, 즉 데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근할 때 반환
  • 객체 내부의 존재하지 않는 프로퍼티에 접근하려고 할때 반환
  • return 문이 없거나 호출되지 않는 함수의 실행 결과 (표현식이 아닌 문)

Symbol(심볼 타입)

  • 다른 값과 중복되지 않는 유일무이한 값

참조형 - 객체(Array, Function, Date, RegExp, Map, Set 등)


데이터 처리 과정 전 - 메모리, 데이터(타입)

값은 메모리에 저장하고 참조할 수 있어야한다.
메모리에 값을 저장하려면 머저 확보해야할 메모리의 공간 크기를 결정해야한다.

메모리

  • 데이터를 저장할 수 있는 메모리 셀의 집합체
  • 각 셀은 고유의 메모리 주소를 갖는다

비트

  • 0, 1만 표현할 수 있는 하나의 메모리 조각
  • 각 비트는 고유한 식별자를 통해 위치를 확인할 수 있습니다.

비트 단위로 위치를 확인하는 것의 비효율성으로 인해 바이트라는 단위가 생김 (많은 비트를 하나의 단위로 묶으면 표현할 수 있는 값도 늘어나면서 동시에 검색 시간을 줄일 수 있음)

바이트

  • 1바이트는 8개의 비트로 구성 (2^8 = 256)

모든 데이터는 바이트 단위의 식별자, 더 정확하게는 메모리 주솟값을 통해서 구분하고 연결할 수 있습니다.

식별자

  • 어떤 데이터(메모리 공간)를(을) 식별하는데 사용하는 이름 ex) 변수명
  • 식별자는 값이 아니라 메모리 주소를 기억하고 있다.
  • 실행 컨텍스트에 등록된다.

자바스크립트 엔진은 데이터 타입, 즉 값의 종류에 따라 정해진 크기의 메모리 공간을 확보한다.
변수에 할당되는 값의 데이터 타입에 따라 확보해야할 메모리 공간의 크기가 결정된다.

데이터 타입이 필요한 이유

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

데이터 처리 과정 - 변수 선언, 데이터 할당

변수

  • 변경 가능한 데이터가 담길 수 있는 공간
  • 하나의 값을 저장하기 위해 확보한 메모리 공간 자체
  • 값의 위치를 가리키는 상징적인 이름

변수 선언

  • 값을 저장하기 위한 메모리 공간을 확보
  • 변수 이름과 확보된 메모리 공간의 주소를 연결
  • 소스코드가 한 줄씩 순차적으로 실행되는 시점 즉, 런타임이 아니라 그 이전 단계에서 실행됨 (소스코드 평가 과정)

자바스크립트 엔진 - 변수 선언

  1. 선언 단계 - 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알림
  2. 초기화 단계 - 값을 저장하기 위한 메모리 공간 확보 (암묵적으로 undefined 할당)

변수 호이스팅

  • 변수 선언문이 코드의 선두로 끌어올려진 것처럼 동작하는 자바스크립트 고유의 특징

데이터 할당

자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)된다. 그리고 재할당으로 변수의 타입은 언제든지 동적으로 변할 수 있다.(동적 타이핑)

할당 - 변수에 값을 저장하는 것
참조 - 변수에 저장된 값을 읽어 들이는 것

변수 선언과 값의 할당의 실행 시점이 다르다.

  • 변수 선언 - 런타임 이전
  • 값의 할당 - 소스코드가 순차적으로 실행되는 시점인 런타임에 실행

변수(이름)은 값의 메모리 주소를 가진다. 즉 값은 별도의 메모리에 저장되어있다.


기본형 데이터 vs 참조형 데이터 - 불변값, 가변값, 변수 복사

기본형 데이터는 불변값이다.

변경 불가능하다는 것은 변수가 아니라 값에 대한 진술이다.

원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에는 실제 값이 저장된다.
객체를 변수에 할당하면 변수(확보된 메모리 공간)에는 참조값이 저장된다.

불변성을 갖는 원시값을 할당한 변수는 재할당이외에 변수 값을 변경할 수 있는 방법이 없다.

가변값

객체는 프로퍼티의 개수가 정해져 있지 않고, 동적으로 추가되거나 제거될 수 있다. 프로퍼티 값에도 제약이 없다.

객체는 원시값과 같이 확보해야할 메모리 공간의 크기를 사전에 정할 수 없다.

객체는 변경가능한 값이다.

객체를 할당한 변수가 기억하는 메모리 주소를 통해 메모리 공간에 접근하면 참조값에 접근할 수 있다. 참조값은 생성된 객체가 저장된 메모리 공간의 주소 그 자체이다.

"변수는 객체를 참조하고 있다"

객체를 할당한 변수는 재할당 없이 객체를 직접 변경할 수 있다. (프로퍼티 동적 추가, 값 갱신 삭제)

"가변"은 참조형 데이터 자체를 변경할 경우가 아니라 그 내부의 프로퍼티를 변경할 때만 성립한다.


변수 복사

  1. 변수에 원시값을 갖는 변수를 할당하면 할당 받는 변수에는 할당되는 변수의 원시값이 복사되어 전달된다.
    값에 의해 전달된 값은 다른 메모리 공간에 저장된 별개의 값이다.

    값에 의한 전달 - 사실 값을 전달하는 것이 아니라 메모리 주소를 전달한다. 단, 전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있다.
    두 변수의 원시값은 서로 다른 메모리 공간에 저장된 별개의 값이 되어 재할당하더라도 서로 간섭할 수 없다.

  2. 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조값이 복사되어 전달된다. (두 개의 식별자가 하나의 객체를 공유한다는 것을 의미)
    원본 또는 사본 중 어느 한쪽에서 객체를 변경(변수에 새로운 객체를 재할당하는 것이 아니라 객체의 프로퍼티 값을 변경하거나 프로퍼티를 추가,삭제)하면 서로 영향을 받는다.

  1. 중첩된 객체의 경우, 얕은 복사, 깊은 복사 현상이 발생할 수 있다. (중첩된 객체에서 참조형 데이터가 저장된 프로퍼티를 복사할 때 그 주솟값만 복사하기때문에)

    따라서 객체의 프로퍼티 중에서 그 값이 기본형 데이터일 경우에는 그대로 복사하면 되지만 참조형 데이터는 다시 그 내부의 프로퍼티들을 복사해야합니다.


    [출처]
    모던 자바스크립트 Deep Dive 위키북스 이웅모 지음
    코어 자바스크립트 위키북스 정재남 지음

profile
큰 것을 작게, 작은 것을 구체적이게, 개발자답게
post-custom-banner

0개의 댓글