데이터 타입

RuLu·2023년 9월 10일
0
post-thumbnail

데이터 타입

1-1 데이터 타입의 종류

  • 기본형(원시형) - 숫자, 문자열, 불리언, null, undefined, 심볼(ES6)
    • 값이 담긴 주솟값을 바로 복제
    • 불변성
  • 참조형 - 객체, 배열, 함수, 날짜, 정규표현식, ES6(Map, WeakMap, Set, WeakSet…)
    • 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제

1-2 데이터 타입에 관한 배경지식

1-2-1 메모리와 데이터

  • 메모리: 매우 많은 비트들로 구성
  • 각 비트는 고유한 식별자를 통해 위치를 확인할 수 있음 →비트 단위로 위치를 확인하는 것은 비효율적 → 몇 개씩 묶어 하나의 단위로 여긴다면 표현 가능한 값도 늘고 검색시간도 줄일 수 있음
    • 다만, 낭비되는 비트가 생기기도 함
    • 제약이 생기더라도 크게 문제가 되지 않을 적정한 공간을 묶는 것이 나음 → 바이트의 탄생
  • JS는 과거에 비해 메모리가 월등히 커진 상황에서 등장 → 메모리 관리에 대한 압박이 ⬇️
    • 정수형인지 부동소수형인지 구분하지 않고 64비트(8바이트)를 확보함.
    • 문자는 정해져 있지 않다(쵸파의 의견)
  • 메모리 주솟값을 통해 서로 구분하고 연결 할 수 있음

1-2-2 식별자와 변수

  • 변수: 변할 수 있는 수 (변할 수 있는 무언가 == 데이터)
  • 식별자: 변수명(어떤 데이터를 식별하는데 사용하는 이름)

1-3 변수 선언과 데이터 할당

1-3-1 변수 선언

  • 변수: 변경 가능한 데이터가 담길 수 있는 공간(그릇)

1-3-2 데이터 할당

  • 왜 변수 영역에 값을 직접 대입하지 않고 굳이 번거롭게 한 단계를 더 거칠까?
    • 데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 더욱 효율적으로 관리하기 위함
  • 새로운 값을 대입할 때 별도의 공간에 데이터를 저장하고 그 주소를 변수 공간에 연결

1-4 기본형 데이터와 참조형 데이터

1-4-1 불변값

  • 변수와 상수를 구분하는 성질은 변경 가능성.
  • 위의 상황에서 변경 가능성의 대상은 변수 영역 메모리 → 한번 데이터 할당이 이뤄진 변수 공간에 다른 데이터 재할당이 가능한지
  • 불변성 여부를 구분할 때 변경 가능성 대상은 데이터 영역의 메모리
  • 기본형은 모두 불변값
    • 변경은 새로 만드는 동작을 통해서만 이루어진다.

1-4-2 가변값

  • 참조형 데이터의 기본적인 성질은 가변값인 경우가 많지만 설정에 따라 변경 불가능 한 경우도 있고, 불변값으로 활용하는 방안도 있다.
  • 기본형과 달리 ‘객체의 변수 영역’이 별도로 존재
  • 객체가 별도로 할애한 영역은 변수 영역, 데이터 영역은 기존의 메모리 공간 활용
    • 데이터 영역에 저장된 값은 불변값, 변수에는 다른 값을 얼마든지 대입가능
  • 중첩 객체 - 참조형 데이터의 프로퍼티에 다시 참조형 데이터를 할당하는 경우
  • 참조 카운트 - 어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수
  • 참조 카운트가 0인 메모리 주소는 가비지 컬렉터의 수거 대상

1-4-3 변수 복사 비교

  • 기본형은 주솟값을 복사하는 과정이 한 번만 이뤄지고, 참조형은 한 단계를 더 거치게 된다.
  • 참조형 데이터가 가변값이라고 설명할 때의 가변은 참조형 데이터 자체를 변경할 경우가 아닌 그 내부의 프로퍼티를 변결할 때만 성립

1-5 불변 객체

1-5-1 불변 객체를 만드는 방법

  • 불변 객체가 필요한 경우 : 값으로 전달받은 객체에 변경을 가하더라도 원본 객체는 변하지 않아야하는 경우
  • 서로 합의 하고 규칙을 지킨다는 전제에선 불변 객체지만, 인간을 믿을 수 없다
  • → 라이브러리가 등장(불변성을 지닌 별도의 데이터 타입과 그에 따른 메서드 제공)

1-5-2 얕은 복사와 깊은 복사

  • 얕은 복사: 바로 아래 단계의 값만 복사
    • 중첩된 객체에서 참조형 데이터가 저장된 프로퍼티를 복사할 때 그 주솟값만 복사
    • →해당 프로퍼티에 대해 원본과 사본이 모두 동일한 참조형 데이터의 주소를 가리킴
  • 깊은 복사: 내부의 모든 값들을 하나하나 찾아서 전부 복사
  • 객체를 복사할 때 프로퍼티가 기본형 데이터일 경우 그대로 복사, 참조형 데이터는 다시 그 내부의 프로퍼티를 복사

1-6 undefined와 null

  • undefined: 사용자가 명시적으로 지정할 수도 있지만 JS엔진이 자동으로 부여하는 경우도 있음
    • JS 엔진은 사용자가 값을 지정할 것이라고 예상되는 상황에 그러지 않으면 undefined
      • 값을 대입하지 않은 변수
      • 객체 내부의 존재하지 않는 프로퍼티를 접근하려고 할 때
      • return 문이 없거나 호출되지 않는 함수의 실행결과
    • 사용자가 부여한 경우 실존하는 데이터, JS엔진이 반환해주는 경우 말그대로 값이 없음.
  • 배열의 경우 조금 특이함
    • 비어있는 요소와 undefined를 할당한 요소는 다르다
      • 비어있는 요소는 순회와 관련된 많은 배열 메서드들의 순회에서 제외
      • 배열도 객체이기 때문에 존재하지 않는 프로퍼티에 대해서 순회 할 수 없다.
  • 비어있음을 명시적으로 나타내고 싶을 때는 null을 사용
    • typeof null이 object인데 이건 그냥 버그이다.
  • undefined와 null을 구분하고 싶다면 일치연산자(===) 사용
profile
프론트엔드 개발자 루루

0개의 댓글