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

lunaxislu·2023년 12월 4일

1. 데이터 타입 심화

(1) 데이터 타입의 종류 ( 기본형 & 참조형)

(이미지 출처 : https://velog.io/@imjkim49/자바스크립트-데이터-타입-정리)

자바스크립트에서 값의 타입은 크게
1. 기본형(Primitive Type)
2. 참조형(Reference Type)으로 구분

기본형과 참조형의 구분 기준은 값의 저장 방식과, 불변성 여부 이다.

1. 복제의 방식
  a. 기본형 : 값이 담긴 주소값을 바로 복제
  b. 참조형 : 값이 담긴 주소값들로 이루어진 묶음을 가리키는 주소값을 복제

2. 불변성의 여부

a. 기본형 : 불변성을 띔
b. 참조형 : 불변성을 띄지 않음

(2) 메모리와 데이터에 관한 배경지식

  1. 메모리, 데이터

    1. 비트

      1. 컴퓨터가 이해할 수 있는 가장 작은 단위죠
      2. 0과 1을 가지고 있는 메모리를 구성하기 위한 작은 조각을 의미한다고 보면 될 것 같아요!
      3. 이 작은 조각들이 모여서 여러분들이 흔히 들으시는 ‘메모리’가 만들어지는 것이죠.
    2. 바이트

      1. 0과 1만 표현하는 비트를 모두 찾기는 부담

      2. 1개 → 2개 → … → 8개(새로운 단위 : byte)

        (이미지 출저)(https://namu.wiki/w/%EB%B0%94%EC%9D%B4%ED%8A%B8))]

  2. 메모리(memo + ry) : byte 단위로 구성
    1. 모든 데이터는 byte 단위의 식별자인 메모리 주소값을 통해서 서로 구분이 됩니다.

    만일, 64비트(8바이트) 정수는 메모리에 어떻게 저장할 수 있을까요?
    ⇒ 64비트를 8개의 바이트로 분할하고, 각 바이트를 메모리에 저장해야 해요. 각 바이트는 8개의 비트를 가므로 64비트 정수는 메모리에서 8개의 연속된 바이트에 저장된답니다.

  3. java, c와 다른 javascript의 메모리 관리 방식(feat. 정수형)

    1. 8을 저장하는 방법
      1. JS : let a = 8(8byte)
      2. JAVA
        a. byte a = 8(1byte)
        b. short a = 8(2byte)
        c. int a = 8(4byte)
        d. long a = 8(16byte)
    2. java 또는 c언어가 초기에 등장했을 때 숫자 데이터 타입은 크기에 따라 다양하게 지정해줘야 할 만큼 개발자가 handling 할 요소들이 많았다. 하지만 javascript는 이런 부분에서는 상당히 편리하다. 메모리 이슈까지는 고민하지 않아도 되므로 😎
  4. 식별자, 변수

    1. var testValue = 3
    2. 변수 = 데이터
    3. 식별자 = 변수명

(3) 변수 선언과 데이터 할당

  1. 할당 예시(풀어 쓴 방식, 붙여 쓴 방식 동일하게 동작)
/** 선언과 할당을 풀어 쓴 방식 */
var str;
str = 'test!';

/** 선언과 할당을 붙여 쓴 방식 */
var str = 'test!';
주소…1002100310041005…
데이터
주소…5002500350045005…
데이터
  1. 값을 바로 변수에 대입하지 않는 이유(=무조건 새로 만드는 이유)

  2. 자유로운 데이터 변환

    1. 이미 입력한 문자열이 길어진다면?

    2. 숫자는 항상 8byte로 고정이지만, 문자는 고정이 아니에요(영문 : 1byte, 한글 : 2byte). 그래서, 이미 1003 주소에 할당된 데이터를 변환하려 할 때 훨씬 더 큰 데이터를 저장하려 한다면 → 1004 이후부터 저장되어있는 모든 데이터를 오른쪽으로 다~~~ 미뤄야 한다..!?
  3. 메모리의 효율적 관리

    2-1.

    똑같은 데이터를 여러번 저장해야 한다면?

    2-2.

    1만개의 변수를 생성해서 모든 변수에 숫자 1을 할당하는 상황을 가정해 봅시다. 모든 변수를 별개로 인식한다고 한다면, 1만개의 변수 공간을 확보해한다.

    1. 바로 대입하는 case) 숫자형은 8 바이트 고정이다
      a. 1만개 * 8byte = 8만 byte

    2. 변수 영역에 별도 저장 case)
      a. 변수 영역 : 2바이트 1만개 = ****2만바이트

      ℹ️ 이해를 돕고자, 변수 영역에 저장되는 데이터는 2바이트로 가정!

      b. 데이터 영역 : 8바이트 1개 = 8바이트

      c. 총 : 2만 8바이트

(4) 기본형 데이터와 참조형 데이터

  1. 메모리를 기준으로 다시한번 생각해보는 두 가지 주요 개념

    a. 변수 vs 상수

    변수 : 변수 영역 메모리를 변경할 수 있음
    상수 : 변수 영역 메모리를 변경할 수 없음

    b. 불변하다 vs 불변하지 않다.

    불변하다 : 데이터 영역 메모리를 변경 할 수 없음
    불변하지 않다 : 데이터 영역 메모리를 변경할 수 있음

  2. 불변값과 불변성 ( with 기본형 데이터 )

    // a라는 변수가 abc에서 abcdef가 되는 과정을 통해 불변성을 유추해자!
    
    // 'abc' 라는 값이 데이터 영역의 @5002라는 주소에 들어갔다고 가정해보자
    var a = 'abc'
    // 'def'라는 값이 @5002라는 주소에 추가되는 것이 아니다.
    // @5003에 별도로 'abcdef'라는 값이 생기고 a라는 변수는 @5002 -> @5003
    // 즉, "변수 a는 불변하다." 라고 할 수 있다.
    // 이 때, @5002는 더 이상 사용되지 않기 때문에 가비지컬렉터의 수거 대상이 된다.
    a = a + 'def'
  3. 가변값과 가변성( with 참조형 데이터 )

    a. 참조형 데이터 변수 할당 과정

    // 참조형 데이터는 별도 저장공간( obj1을 위한 별도 공간)이 필요!!
    var obj1 = {
      a : 1,
      b : 'bbb'
    }
주소1001100210031004
데이터obj1/
주소5001500250035004
데이터1'bbb'

주소7103710471057106
데이터a/a5001b/5002

b. 기본형 데이터의 변수 할당 과정과 차이점 : 객체의 변수(프로퍼티) 영역의 별도 존재 여부
c. 참조형 데이터가 불변하지 않다( 가변하다) 라고 하는 이유

var obj1 = {
	a: 1,
	b: 'bbb',
};

// 데이터를 변경해보면
obj1.a = 2;
  1. 과정은
    a. 변경할 값인 숫자 2를 데이터 영역에서 검색
    b. 없으면, 2를 새로 추가하고, 해당 주소(ex: @5003)를 obj1을 위한 별도 영역에 갈아껴줌
  2. 데이터 영역에 저장된 값은 여전히 계속 불변값이지만, obj1을 위한 별도 영역은 얼마든지 변경이 가능.
    이것 때문에 참조형 데이터를 흔히, ‘불변하지 않다(=가변하다)’라고 한다.

1개의 댓글

comment-user-thumbnail
2023년 12월 6일

멋집니다.

답글 달기