[1장] 데이터 타입

자바 스크립트의 데이터 타입

  • 기본형
    • number
    • string
    • boolean
    • null
    • undefined
    • Symbol(ES6 스펙 추가)
  • 참조형
    • Object
    • Array
    • Function
    • Date
    • RegExp
    • Map, WeakMap, Set, WeakSet(ES6 스펙 추가)

 

기본형/참조형 구분

  • 기본형은 할당/연산시 복제
    • 값이 담긴 주소값을 바로 복제
  • 참조형은 주소를 참조
    • 값이 담긴 주소값의 묶음을 가리키는 주소값을 복제

 

메모리와 데이터

  • 정적 타입 언어 (C/C++, 자바 등) → 데이터 타입별로 할당 메모리 영역 구분 
    • 개발자가 직접 형변환 필요
  • 자바스크립트 → 넉넉하게 메모리 할당
    • 개발자가 형변환 할 일 ↓
  • 모든 데이터는 메모리 주소값으로 서로 구분하고 연결

 

식별자와 변수

  • 변수 → 변할 수 있는 데이터
  • 식별자 → 데이터를 식별하는데 사용하는 이름: 변수명

 

변수 선언과 데이터 할당

  • 변수: 변경 가능한 데이터가 담길 수 있는 공간 또는 그릇
  • 사용자가 메모리 주소에 접근 시 해당 메모리에 담긴 데이터를 반환

 

  • 변수에 데이터 할당시 별도의 메모리 공간 확보후 저장 → 해당 메모리 주소를 변수 영역에 저장함
  • 변수 영역에 값 직접 대입하지 않는 이유
    • 데이터 변환의 자유로움
    • 메모리 효율적 관리
    • 숫자형 데이터는 8바이트(64비트) 공간 확보 : 문자열 데이터는 정해진 규격이 없음
      • 영어는 1바이트, 한글은 2바이트로 필요한 용량이 가변적임
    • 효율적인 문자열 데이터의 변환을 위해 변수와 데이터를 별도로 나누어 저장
      • 중복된 데이터에 대한 처리 효율 상승

 

기본형 데이터와 참조형 데이터

  • 불변값
    • 변수/상수의 구분점: 변경 가능성
    • 변수 영역 메모리 vs 데이터 영역 메모리
      • 기본형: 숫자, 문자열, boolean, null, undefined, Symbol → 불변
        • 한번 만든 값 변경 불가
        • 새로 만드는 동작으로만 변경 가능
  • 가변 값
    • 참조형 데이터 vs 기본형 데이터
      • 객체 변수 영역이 별도로 존재
      • 데이터 영역에 저장된 값: 불변값
      • 변수에는 다른 값 대입 가능: 참조형 데이터가 가변이라 불리는 이유
    • 중첩 객체: 참조형 데이터의 프로퍼티에 참조형 데이터를 할당하는 경우
    • 참조 카운트가 0인 메모리 주소는 가비지 컬렉터의 수거 대상: 빈 공간으로 변경

 

불변 객체

  • 참조형 데이터의 가변: 내부 프로퍼티를 변경할 때만 성립
    • 데이터 자체를 수정하면 기존 데이터는 변경되지 않음
  • 불변 객체가 필요한 경우
    • 값으로 전달받은 객체에 변경을 가하더라도 원본 객체에 영향이 가지 않아야하는 경우

 

얕은 복사와 깊은 복사

  • 얕은 복사
    • 바로 아래 단계의 값만 복사하는 방법
    • 원본과 사본이 모두 동일한 데이터의 주소를 가리킴: 사본을 바꾸면 원본도 바뀜
  • 깊은 복사
    • 내부의 모든 값을 전부 복사하는 방법
    • 원본과 사본의 데이터 주소가 다름: 사본의 수정이 원본까지 영향 X
  • 기본형 데이터일 경우 그대로 복사
  • 참조형 데이터는 내부의 프로퍼티들을 복사

 

undefined와 null

자바스크립트 '없음'을 나타내는 값

  • undefined
    • 사용자가 명시적으로 지정할 수 있음
    • JS 엔진이 자동으로 부여함
    • undefined를 반환하는 경우
      • 값을 대입하지 않은 변수
      • 객체 내부의 존재하지 않는 프로퍼티
      • return 문이 없거나 호출되지 않은 함수의 실행 결과
  • null
    • '비어있음'을 명시적으로 나타내고 싶을 때 사용
    • type of null이 object로 뜸: JS 자체 버그
    • 일치 연산자(===)를 써야지 타입을 확실히 판별 가능
  •