[DAY15] Today I Learned

1nxeo·2023년 2월 21일

항해99

목록 보기
15/63
post-thumbnail

데이터 타입의 종류


Primate Type (기본형)

  • Number
  • String
  • Boolean
  • null
  • undefined
  • Symbol (ES6)

Reference Type (참조형)

  • Object
    • Array
    • Function
    • RegExp
    • Set / WeakSet (ES6)
    • Map / WeakMap (ES6)

데이터가 메모리에 저장되는 방식


저장되는 장소

  • Stack memory
    • 변수
    • 기본형 데이터
    • 정적 할당
  • heap memory
    • 참조형 데이터
    • 동적 할당

기본형 데이터가 저장되는 방식

💡 각 메모리에 주소가 부여되어 있다.
  1. 변수 선언

    • 메모리 안에서 데이터가 담길 공간을 확보 ( ex.1003번을 확보 )
    var a;
    • 메모리 그림
      graph TD
      A1[...] --> A2[ ]
      A3[1002] --> A4[ ]
      A5[1003] --> A6[이름:a / 값: ]
      A7[1004] --> A8[ ]
      A9[1005] --> A10[ ]
      
      graph TD
      A1[...] --> A2[ ]
      A3[5002] --> A4[ ]
      A5[5003] --> A6[ ]
      A7[5004] --> A8[ ]
      A9[5005] --> A10[ ]
      
  1. ‘abc’라는 데이터를 a에 할당

    • 다른 주소에 ‘abc’ 를 넣고 a의 주소값이 ‘abc’를 넣은 곳의 주소값을 가르키도록 한다.
    var a;
    a = 'abc';
    • 메모리 그림
      graph TD
      A1[...] --> A2[ ]
      A3[1002] --> A4[ ]
      A5[1003] --> A6[이름:a / 값: 주소 5004]
      A7[1004] --> A8[ ]
      A9[1005] --> A10[ ]
      
      graph TD
      A1[...] --> A2[ ]
      A3[5002] --> A4[ ]
      A5[5003] --> A6[ ]
      A7[5004] --> A8['abc']
      A9[5005] --> A10[ ]
      
  1. ‘abcdef’를 재할당

    • 다른 주소에 'abcdef' 를 넣고, a가 가르키는 주소값을 다르게 한다.
    // 변수 a를 선언
    var a;
    a = 'abc';
    a = 'abcdef';
    • 메모리 그림
      graph TD
      A1[...] --> A2[ ]
      A3[1002] --> A4[ ]
      A5[1003] --> A6[이름:a / 값: 주소 5005]
      A7[1004] --> A8[ ]
      A9[1005] --> A10[ ]
      
      graph TD
      A1[...] --> A2[ ]
      A3[5002] --> A4[ ]
      A5[5003] --> A6[ ]
      A7[5004] --> A8['abc']
      A9[5005] --> A10['abcdef']
      

참조형 데이터가 저장되는 방식

💡 재할당 등을 하여 참조 카운트가 0인 대상은 가비지 컬렉터에 인해 사라지게 된다.
  • 아래 두 코드는 같다.
var obj = {
	a: 1,
	b: 'bbb'
}

=

var obj;

obj = {
	a: 1,
	b: 'bbb'
}
  • 메모리 할당 과정에서 기본형보다 한단계 더 거치기 때문에, 바로 참조가 안된다. 스크린샷 2022-09-28 오전 4.29.29.png
  • 5002번에서 참조하고 있는 @7103 ~ ? 는, 객체의 프로퍼티가 얼마나 될지 모르기 때문
  • 객체 안의 값을 변경하려고 할 땐, 아래와 같이 동작한다.
    • 동작 방식 스크린샷 2022-09-28 오전 4.31.37.png 스크린샷 2022-09-28 오전 4.32.26.png
    • 중첩 객체의 동작 방식 스크린샷 2022-09-28 오전 4.34.57.png

매번 값을 다른 주소에 저장해서 참조를 하는 이유

값을 직접 저장하는 방식

  • 데이터 할당 ⇒ 빠름
  • 비교에 비용이 많이 듬
    • 컴퓨터는 자신이 이해할 수 있는 언어로 변환을 한 후 저장을 하기 때문
  • 메모리 낭비가 심함

값의 주소를 저장

  • 데이터 할당 ⇒ 느림
  • 비교에 비용이 들지 않음
    • 같은 값이 전체 메모리 공간 상에 오직 하나만 존재
    • 기본형 데이터 ⇒ 불변값
  • 메모리 낭비 최소화
profile
항상 피곤한 인서의 개발블로그

0개의 댓글