모던 자바스크립트 Deep Dive - 11. 원시 값과 객체의 비교

둡둡·2024년 1월 2일

Modern Javascript Deep Dive

목록 보기
12/49

11. 원시 값과 객체의 비교

  • 원시 타입과 객체 타입의 차이점
    • 원시 값은 변경 불가능한 값이지만, 객체는 변경 가능한 값
    • 변수(= 확보된 메모리 공간) 할당하면 원시 값은 실제 값을, 객체는 참조 값을 저장함
    • 변수 값을 다른 변수에 할당하면 원시 값은 복사되어 전달(값에 의한 전달), 객체는 참조 값이 복사되어 전달됨(참조에 의한 전달)

11.1. 원시 값

11.1.1. 변경 불가능한 값

  • 원시 값은 변경 불가능한 읽기 전용 (변수가 아닌) ' 값'
    • 데이터의 신뢰성 보장
    • 불변성(immutability)
  • 변수는 재할당을 통해 값을 변경(교체)할 수 있음
    • 값이 있는 변수에 새로운 원시 값을 재할당하면 이전 값을 변경하는 것이 아님
    • 새로운 메모리 공간에 재할당 원시 값을 저장 후, 변수가 참조하는 메모리 공간의 주소를 변경함

11.1.2. 문자열과 불변성

  • 문자열은 0개 이상의 문자(character)로 이뤄진 집합
    • 1개의 문자는 2바이트의 메모리 공간 필요
  • 문자열은 유사 객체 배열이면서 이터러블
  • 하지만 문자열은 원시 값이므로 변경 불가능함 -> 데이터 신뢰성 보장

11.1.3. 값에 의한 전달

  • 변수에 원시 값을 갖는 변수를 할당하면 원시 값이 복사(copy)됨 -> 값에 의한 전달
    • 엄밀히 말하자면 값이 아닌 메모리 주소를 전달하여 이를 통해 값을 참조할 수 있음
  • 하지만 다른 메모리 공간에 저장된 별개의 값
    • 기존 값과 복사한 값을 변경해도 서로 영향을 주지 않음, 간섭할 수 없음

11.2. 객체

  • 객체는 프로퍼티의 개수나 값에 대한 제약이 없기 때문에 원시 값과 다른 동작 방식으로 설계됨
    • 프로퍼티 키를 인덱스로 사용하는 해시 테이블(hash table) 방식

11.2.1. 변경 가능한 값

  • 객체(참조)는 변경 가능한 값
  • 객체를 할당한 변수는 메모리 주소를 저장하고, 메모리 공간에 접근하여 참조 값에 접근함
  • 객체를 할당한 변수는 '객체를 참조하고 있다' 또는 '가리키고 있다'고 표현함
  • 재할당 없이 동적으로 객체를 직접 변경할 수 있음
  • 단, 여러 개의 식별자가 하나의 객체를 공유할 수 있음
    • 복사가 아닌 할당을 하는 경우 하나의 객체를 공유함 (비교 결과: true)
    • 원본과 복사본은 참조 값이 다른 별개의 객체가 됨 (비교 결과: false)
      • 얕은 복사: 한 단계까지만 복사 ({ ... obj })
      • 깊은 복사: 객체에 중첩되어 있는 객체까지 모두 복사 (lodash .cloneDeep(obj))

11.2.2. 참조에 의한 전달

  • 객체가 저장된 변수를 다른 변수에 할당하면 '참조 값'이 복사되어 전달됨(동일한 객체를 공유함)
    • 원본이나 사본 중 어느 한 쪽에서 객체를 변경하면 서로 영향을 받음

[출처] 모던 자바스크립트, Deep Dive

profile
괴발개발라이프

0개의 댓글