• Blog
  • Projects
  • Resume
profile_image

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

StudyJavaScript

2024.01.16

11. 원시 값과 객체의 비교

  • 원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에 실제 값 저장
    객체를 변수에 할당하면 변수(확보된 메모리 공간)에는 참조 값 저장
  • 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달 → 값에 의한 전달 (pass by value)
  • 객체를 가르키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달 → 참조에 의한 전달 (pass by reference)


11.1 원시 값

11.1.1 변경 불가능한 값

  • 원시 값(원시 타입(primitive type) 값)은 변경 불가능한 값

    • 변수: 하나의 값을 저장하기 위해 확보한 메모리 공간
      : 변수에 저장된 데이터로서 표현식이 평가되어 생성된 결과
    • 즉, 변경 불가능하다는 것은 변수가 아니라 에 대한 진술.
  • 원시 값을 할당한 변수에 새로운 원시 값을 재할당하면?

    • 메모리 공간에 저장되어 있는 재할당 이전의 원시 값을 변경하지 않고, 새로운 메모리 공간을 확보하고 재할당한 원시 값을 저장
      → 변수는 새롭게 재할당한 원시 값을 가리킨 후 변수가 참조하던 메모리 공간의 주소가 바뀜 (불변성(immutability) 을 뜻함)
      • [참고 이미지 1]
        01
      • [참고 이미지 2] 만약 원시 값이 변경 가능한 값이라면?
        02
    • 불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없음

11.1.2 문자열과 불변성

  • 문자열은 유사 배열 객체이며 이터러블이므로 배열과 유사하게 각 문자에 접근 가능
    • 하지만.. 문자 하나씩은 변경 불가 (원시 값이기에!)

11.1.3 값에 의한 전달

  • 코드 예시
    var score = 80;
    var copy = score; // 80
    score = 100;
    console.log(score, copy); // 100 80
    
    • 변수 copy에 원시 값을 갖는 변수 score를 할당하면
      할당 받는 변수 copy에 할당 되는 변수 score의 원시 값이 복사되어 전달됨!
      값에 의한 전달 (pass by value)
    • 각 변수의 값이 같더라도 다른 메모리 공간에 저장된 별개의 값!
      03
  • "값에 의한 전달"에 대한 오해 (자바스크립트를 위한 용어가 아니므로!)
    • 자바스크립트에서 변수에 값이 전달되는 것이 아니라 메모리 주소가 전달됨
      (변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하기에)


11.2 객체

11.2.1 변경 가능한 값

  • 객체(참조) 타입의 값, 즉 객체변경 가능한 값
  • 객체를 할당한 변수가 기억하는 메모리 주소를 통해 메모리 공간에 접근하면 참조 값(reference value)에 접근할 수 있음
    • 참조 값은 생성한 객체저장된 메모리 공간의 주소
    • 이러한 특징에 의해 여러 개의 식별자가 하나의 객체를 공유하는 부작용이 있음!
      04
  • 값에 의한 전달참조에 의한 전달은 식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달한다는 면에서 동일
    • 즉, 자바스크립트에는 값에 의한 전달만 존재한다고 할 수 있음
    • 공유에 의한 전달이라는 표현도 있지만 ECMAScript 사양에 정의된 공식적인 언어가 아님! (이 같은 동작 방식을 설명하는 정확한 용어가 존재하지 않음..)