reference data type

재웅·2023년 4월 1일
0

오늘의 정리

목록 보기
7/52
post-thumbnail

Primitive data type

자바스크립트의 자료형 (문자, 숫자, array, object 등)은 자료형을 크게 2개로 분류합니다.

Primitive & reference라고 분류

Primitive data type들은 그냥 별건 없고 자료 자체가 변수에 저장되는 자료들입니다.

문자, 숫자 자료형들이 대표적인 primitive data type들입니다.

var 이름1 = '김'; 
var 이름2 = 이름1;
이름1 = '박';
console.log(이름1) // 박
console.log(이름2) // 김

reference data type

예제 1) 복사하면 이상한 일이

var 이름1 = { name : '김' };
var 이름2 = 이름1;
이름1.name = '박';
console.log(이름1); //{name : '박'}
console.log(이름2); //{name : '박'}

이름2는 값을 전혀 수정한 적이 없는데 왜 바뀌는건지?

두번째줄이 문제입니다.

이름2에 이름1을 복사해서 집어넣을 때가 문제

이 때, 이름1에 있던 { name : '김' } 이라는 데이터가 복사된게 아닙니다.

왜냐면 이름1에는 {} 이게 저장된게 아니라 reference (화살표)가 저장되어있다고 했으니까요.

이름1의 화살표를 이름2에 복사하신겁니다.

이제 이름1과 이름2는 같은 화살표를 가지고 있습니다.

이름1과 이름2는 같은 화살표 (reference) 를 가지게 된 것이고

그 화살표는 { name : '김' } 이라는 같은 값을 가리키고 있는 것일 뿐입니다.

코드 셋째줄에서 이름1.name = '박' 이렇게 값 변경을 하면 어떻게 되나?

화살표를 타고 들어가서 name 을 '박'으로 설정해줍니다.

근데 가만히 있던 이름2를 출력해보면

화살표를 타고 들어가서 { name : '박' } 이라는 데이터가 나오게 되는 것이지요.

아무튼 이런 원리 때문에 이름1과 이름2는 같은 값을 공유하고 있었던 것입니다.

결론은 obj,arr 자료형은 등호로 복사하면 화살표 값을 공유하기 때문에 문제가 일어난다.


예제 2) 화살표가 할당되는 기준 & object 두개가 같은지

var 이름1 = { name : '김' };
var 이름2 = { name : '박' };

위처럼 새로운 {} object를 할당할 때마다 화살표가 새로 생성된다고 생각하면 됨

지금 첫줄과 둘째줄 모두 object를 새로 할당해주고 있습니다.

실은 object가 저기 있다는 화살표를 할당해준 것

var 이름1 = { name : '김' };
var 이름2 = { name : '김' };

이름1 == 이름2 // false

이름1 == 이름2 가 왜 false 가 나오는지?

값이 같아도 화살표가 다름 각각 만든거니까 당연히 화살표도 다르니까

이름1(화살표) == 이름2(화살표) 는 다를수밖에 없는것


예제 3) 함수를 이용해 object를 변경하면 어떻게 될까

var 이름1 = { name : '김' };

function 변경(obj){
  obj = { name : 'park' }; 
}

변경(이름1)
   
console.log(이름1); // { name : '김' }

변경()함수에서 이름1 = {name:'park'}로 재할당 해주었는데 왜 안바뀜

(인간의 시점)

var 이름1 = { name : '김' };
function 변경(obj){
  obj = { name : 'park' };
}
변경(이름1);



(자바스크립트의 시점)

var 이름1 = { name : '김' };
function 변경(obj){
  obj = { name : 'park' };
}
변경(var obj = 이름1);

obj라는 파라미터는 변수생성&할당과 똑같다

코드 3번째 줄의 obj = {name:'park'} 이 부분이

var obj = {name:'park'} 이거랑 같다는것

그렇다는건 변경(이름1) 부분이 변경(var obj = 이름1) 과 똑같음

여기서 이름1(변수)에 저장된건 {name : '김'}을 가르키는 화살표임

그래서 obj(파라미터변수)도 같은 화살표를 가지게 되는것

그래서 결론은 변경()함수를 실행해도

obj = {name:'park'} 는 => var obj = {name:'park'}때문에

변수 obj는 {name:'park'} 를 가르키는 화살표가 될 뿐이고

파라미터 자리에 이름1 이 들어가서

이름1 = {name:'park'} 처럼 보여도

이름1 은 {name:'김'} 을 가르키는 화살표일 뿐이다

obj라는 변수에 새로운 화살표를 재할당을 한 것이지

실제 이름1이라는 변수는 전혀 건드리지 않고 있습니다.

그래서 결국 이름1은 바뀌지 않는 것입니다.

profile
오늘의 정리

0개의 댓글