JavaScript에서의 데이터타입 3 _기본형과 참조형 2

JavaScript에서의 데이터타입 3 _기본형과 참조형 2

코어 자바스크립트(정재남 저) 책을 기본으로 하여 자바스크립트를 공부하면서 내용을 정리하고자 한다.


01 데이터타입



변수 복사

기본형 데이터와 참조형 데이터의 차이를 본격적으로 알아보자.

variableCopy1

기본형 데이터의 변수 복사

  : 변수 a를 선언하고 10을 할당하면

    1. 먼저 변수 영역의 빈 공간인 @1001을 확보하고 10을 데이터 영역에서 찾는다.

       없다면 위와 같이 빈 공간(@5001)에 저장한 후 주소값을 @1001에 저장한다.


  : 변수 a를 복사하면

    1. 변수 영역의 빈 공간(@1002)을 확보하고 이름을 b로 지정한다.

    2. 복사한 변수의 값인 @5001을 가져와 @1002의 값으로 저장한다.


변수 복사

참조형 데이터의 변수 복사

  : 변수 obj를 선언하고 프로퍼티들을 할당하면

    1. 변수 영역의 빈 공간(@1003)을 확보하고 obj라고 이름을 지정한다.

    2. 변수의 값인 데이터 그룹을 담기 위해 데이터 영역에서 빈 공간(@5002)를 확보하고

       별도의 변수 영역(@7000 ~ ? )을 생성한 후 그 주소값을 저장한다.

    3. @7000에 num, @7001에 str을 각각 이름으로 저장한 후 각각의 프로퍼티의 값을 데이터 영역에서 찾는다.

    4. @7000의 값인 10은 저장되어 있는 @5001이 있으므로 그대로 저장한다.

    5. @7001인 'String'은 일치하는 데이터가 없으므로 새로운 공간(@5003)을 확보하고 저장한 후

       그 주소값을 @7001의 값으로 저장한다.


  : 변수 obj를 복사하면

    1. 변수 영역에 빈 공간(@5004) 확보하고 obj2라고 지정한다.

    2. 복사한 변수 obj를 검색해 값인 @5002를 가져와 @5004의 값으로 저장한다.


변수를 복사하는 과정에서 기본형과 참조형 모두 동일한 값을 복사한다.

variableCopy2



변수 복사 후 값을 변경한다면?

variableCopy3


객체 프로퍼티 변경

기본형 데이터 변수값 재할당

b = 50;

변수 a를 복사한 변수 b의 값을 50으로 재할당하면 데이터 영역에서 50이 없으므로 새로운 공간(@5004)에 저장되고 그 주소값이 변수 b의 새로운 값으로 변경된다.

참조형 데이터의 객체 프로퍼티 값 재할당

그럼, 변수 obj를 복사한 변수 obj2의 프로퍼티 num의 값을 100으로 재할당하면 어떻게 될까?

obj2.num = 100;

obj2의 num의 값으로 재할당된 100은 데이터 영역에 없으므로 새로운 공간(@5005)에 저장되고,

obj2의 값 @5002의 변수 영역에서 식별자 num을 찾아 값을 @5005로 바꿔준다.

참조형 데이터의 경우, 변수가 가지고 있는 값은 데이터 영역의 주소값인데 그 값 자체가 객체의 변수영역의 주소값이다. 객체의 프로퍼티의 값을 변경하면, 복사된 변수의 값 역시 같은 주소값을 가지기에 그 주소값이 가리키는 객체의 변수영역의 값이 변경되며, 따라서 동일하게 값이 변경되는 것이다.


variableCopy4

☝🏼 Difference ☝🏼

변수 b (@1002) 값은 변경되고, 변수 obj2 (@1004) 값은 변경되지 않는다.

기본형 데이터는 복사한 변수의 값을 변경하면, 바라보는 주소의 값이 변경되기 때문에 서로의 값이 달라진다.

참조형 데이터는 복사한 변수의 값을 변경하면, 바라보는 주소의 값이 같은 주소값이기에 값이 동일하게 변경된다.


  • 코드로 보자면 다음과 같다.

variableCopy5


💡 NOTICE

엄밀하게 말해서 모든 데이터 타입은 변수에 데이터를 할당하기 위해서는 주소값을 복사해야 한다.

그러하기에 결국 모든 데이터 타입은 참조형 데이터이다.

차이라면 기본형 데이터는 주소값 복사과정이 한 번 이루어지고, 참조형 데이터는 주소값을 복사하는 과정이 한 단계 더 있다고 보면 된다.


그럼, 객체를 통째로 변경하면 어떻게 될까?

variableCopy6


객체 자체를 변경


객체를 통째로 복사하니 @1004의 값이 @5002에서 @5006으로 변경됨을 알 수 있다.

obj2에 할당된 데이터 자체가 주소값이 완전히 다른 객체이기 때문에 데이터 영역에 새로 저장되고 할당되는 것이다.

결국 참조형 데이터가 가변적이다.라는 말은 객체 내부의 프로퍼티의 값을 변경할 때만 성립한다.


코드 참고하려면


👉🏻 다음 장에서 이어서 설명 👉🏻 Next Page