JS (Java Script)

데이터 타입에 따른 복사 _ Primitive / Reference data type

GABOJOK 2023. 9. 7. 10:43

데이터를 복사할 때에, a = b; 이렇게만 하면 복사가 완벽히 일어날 것 같지만 모든 데이터가 그렇게 동작하지 않는다. 

데이터의 종류에 따른 복사를 알아보장.

 

Primitive data type

값이 변수에 그대로 저장된다. 그래서 복사가 완벽하게 일어난다. 

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

 

 

Reference data type

자료를 변수에 직접 저장하는게 아니라, 자료가 어디에 있는지를 알려주는 레퍼런스를 변수에 저장한다. 

array, obj가 바로 Reference data type 이다. 

 

var 이름1 = {name : '김'}  // 참조값이 저장됨.
var 이름2 = 이름1    //이말은 {name : '김'} 이 저기 저장되었다는 참조값만. 복사됨.
이름1.name = '박';
console.log(이름1, 이름2)   // name : "박"  name : "박"   출력됨.

그래서 제대로 object 를 복사하고 싶다면, constructor 문법을 이용해서 복사해야 한다. 

 

 

var name1 = {name : '김'};
var name2 = {name : '김'};
console.log(name1 == name2)       //값은 false
console.log(name1.name === name2.name) //값은 true

 

false 가 나오는 이유는 각각 다른 레퍼런스 이기 때문에 당연하다. .
그렇지만 true 가 나오는 경우도 있는데, 이는  각각 다른 레퍼런스 이지만, 그 안에 할당된 값을 비교하기 때문에.

 

 

그럼 아래의 경우는?

var name4 = {name : '김'};
function 변경경(obj){
   obj = {name : 'kim' }; 
}
변경경(name4)
console.log(name4) //{name: '김'}

name4에 새로운 값을 재할당 해서 출력값이 {name : 'kim'} 이 나오기를 기대했지만, 다른게 나왓다. 

이유가 뭘까?

 

1. 변경경(name4)

이렇게 해줌에 따라서, 우리는 변경경 이라는 함수에 파라미터로 변수 name4를 넣어주고 있다. 

그러면 함수의 파라미터는 이렇게 해석한다. var obj = name4 

이건 곧 변수 obj에 name4의 레퍼런스 값을 할당한다는 의미이다. 

 

2. obj ={name : 'kim'}

컴퓨터 시선에서는  선언된 변수 obj에  {name : 'kim'}를 직접 할당해 준것.

의도했던 name4에는 할당되지 않았다. 

 

만약 오브젝트를 할당하지 않고, 오브젝트의 키에 대한 값을 할당했다면 ? 잘 동작한다. 

obj.name = 'kim' 이런식으로 말이다. 

 

 

3. 그 결과 console.log(name4)는 원래 가지고 있던 오브젝트를 출력했다.  

선언된 변수 obj에  {name : 'kim'}를 직접 할당해 준것 이기 때문에..