1 분 소요


자바스크립트의 7가지 데이터 타입은 원시 타입객체 타입으로 구분됨

원시 타입 객체 타입
변경 불가능한 값 변경 가능한 값
변수에 실제 값이 저장 변수에 참조 값이 저장
값에 의한 전달 참조에 의한 전달

* 값에 의한 전달
변수를 다른 변수에 할당할 때 원본의 원시값이 복사되어 전달

* 참조에 의한 전달
변수를 다른 변수에 할당할 때 원본의 참조값이 복사되어 전달


1. 원시값


원시 타입의 값은 변경 불가능한 값 → 재할당을 할때 새로운 값을 생성
교체한다고 하는게 맞는 느낌이다!

변수 age -> 0x000000f2(주소)  |  26(값)
___________________________________________                          
새로 생성    0x00001222(주소)  |  27(값)
___________________________________________                        

           0x000000f2(주소)  |  undefined(값)
변수 age -> 0x00001222(주소)  |  27(값)
___________________________________________                      

원시 값을 재할당하면,

  1. 새로운 메모르 공간 확보
  2. 확보된 메모리에 값 저장
  3. 변수가 참조하는 메모리 변경

값이 변하지 않아 이를 불변성이라고 함


값에 의한 전달

let jongbin = "hi";

// 참조된 주소가 아닌 값이 전달
let jb = jongbin;

console.log(jongbin === jb);    // true
변수 age   ->   0x000000f2(주소)  |  26(값)
              
              ⬇︎ age copy

변수 age   ->   0x000000f2(주소)  |  26(값)
변수 jbAge  ->  0x00001222(주소)  |  26(값)

메모리주소(저장된 값)을 복사한다(참조된 주소값은 다름!)
메모리 주소를 복사하지만 주소값이 같은 것이 아님 → 전달된 메모리 주소로 값을 참조할 수 있다

→ 복사한 변수를 수정해도 원본에 영향을 미치지 않음


2. 객체


객체는 메모리 크기가 정해져 있지도 않고, 프로퍼티를 추가, 삭제, 갱신 할 수 있기 때문에 원시값과는 다른 동작방식을 지닌다.

변경 가능한 값

객체 jongbin -> 0x000000f2(주소)  |  0x00001222(값)   
                                ⬋ 참조(값에 주소를 저장)
               0x00001222(주소)  |  { age: 26 }(값)

원시값과는 다르게 객체는 메모리에 참조값을 저장한다. 객체는 변경이 가능한 값이므로 내부 프로퍼티를 수정할 수 있지만 내부 프로퍼티를 수정해도 참조값은 바뀌지않는다.

이런 방식은 계속해서 변하는 객체의 특성 때문에 고려된 메모리 사용의 효율성과 성능을 위한 방식이다. 하지만 단점으로 여러개의 식별자가 동일한 객체를 공유할 수 있다.


참조에 의한 전달

객체 jongbin -> 0x000000f2(주소)  |  0x00001222(값)   
               0x00001222(주소)  |  { age: 26 }(값)   // 동일한 객체

                               ⬇︎ copy

객체 jb   ->    0x00002323(주소)  |  0x00001222(값)                   
               0x00001222(주소)  |  { age: 26 }(값)   // 동일한 객체

복사를 하게 되면 메모리의 값(참조값)을 복사하기 때문에 동일한 객체를 참조하게 된다. 이는 여러개의 변수가 서로 영향을 미칠 수 있다.

원본의 참조값이 복사되어 전달되는 것을 참조에 의한 전달이라고 한다

참조 값만 복사하는 것을 얇은 복사라고 함

깊은 복사는 객체에 중첩되어 있는 객체까지도 전부 복사함



자바스크립트는 결국 메모리에 저장되어 있는 값을 전달한다 근데 그 값이 그냥 값인지 참조값인지에 따라 나뉘는 것 같다!



이웅모 선생님의 모던 자바스크립트 Deep Dive를 공부하기 위해 정리한 글입니다.
혹시나 보시다가 고칠 부분이나 마음에 안드시는 부분이 있다면 말씀해주시면 감사하겠습니다!