참조와 복사

i do as i say·2020년 5월 15일
0
post-thumbnail

깊은 복사 (값 복사)

기본 자료형 데이터는 =으로 복사를 하게 되면, 그 값은 깊은 복사가 되어, 각각 개별의 값으로 들어가게 된다. 완전하게 복사가 된다는 뜻이다.

let a = 200;
let b = a;

b = 400;

a; // 200
b; // 400

두 변수가 완전히 독립성을 갖는 값을 가지는 것을 값 복사 또는 깊은 복사라고 한다. a나 b에 어떠한 값을 씌우게 되더라도 다른 값에는 영향을 받지 않는다.

얕은 복사 (참조)

변수에 객체를 저장하게 되면, 1번의 값 복사가 아닌, 메모리 어디엔가에 객체를 하나 생성하게 되고, 변수는 그 메모리 값을 참조하게 된다. 따라서 객체나 배열을 복사하려고 할 때 =를 사용하면 참조밖에 할 수 없다.

let obj = {a: 'apple', b: 'banana'};
let obj2 = obj;

obj2.a = 'airplane';

obj; //{a: "airplane", b: "banana"}
obj2; //{a: "airplane", b: "banana"}

변수에 그대로 저장하는 게 아닌, 메모리 값을 같이 공유하기 때문이다.

메모리 주소값 0x00001 안에 {a: 'apple', b: 'banana'} 객체가 들어가게 되고, 변수는 그 메모리의 주소값을 복사합니다.

obj을 obj2로 복사한 후 obj2의 값을 바꾸게 되면, 메모리 주소 안의 있는 값이 바뀌기 때문에 obj의 값도 바뀌게 됩니다.

그렇다면, obj와 obj2를 똑같이 복사를 하면서도 각각의 메모리 주소를 할당하게 하려면 어떻게 해야 할까요?

let obj = {a: 'apple', b: 'banana'};
let obj2 = {};

for(element in obj) {
  obj2[element] = obj[element];
}

obj2; //{a: "apple", b: "banana"}

obj2.c = 'car';

obj2; //{a: "apple", b: "banana", c: "car"}

반복문을 사용해서 값을 하나씩 넣어 주면 됩니다. 그렇게 되면 객체를 생성하고 객체 안에 값을 넣을 때 메모리 주소가 0x00002로 넣어지게 됩니다.

profile
커신이 고칼로리

0개의 댓글