프로그래밍 공부하기

Assignment과 Shallow Copy와 Deep Copy 본문

Web/[JS] Common

Assignment과 Shallow Copy와 Deep Copy

ihl 2020. 12. 17. 21:52

할당과 얕은 복사, 깊은 복사는 헷갈리는 개념이므로 한 번 정리해본다.

1. Assignment vs Copy

할당과 복사의 차이는 무엇일까. 처음에는 reference type을 할당하면 얕은 복사가 된다고 생각했었다. reference를 참조하게 되었기 때문이다. 하지만 엄밀히 말해서 이는 다른 의미이다.

let originObj = {
      pro1: 'AA',
      pro2: 'BB',
      pro3: ['C', 'CC', 'CCC'],
      pro4: {
        'D': 'E',
        'DD': 'EE'
      },
    };
    
let assignObj = originObj;
let copiedObj = Object.assign({}, originObj); //얕은 복사

위 코드처럼 originObj, assiginObj, copied Obj를 선언한 후 둘이 각각 같은지 비교해보자.

assignObj === originObj //true
originObj === copiedObj //false

둘의 결과는 다르다. 그 이유는 assign은 같은 주소를 가져서 같은 공간(value)을 가리키는 형태이지만, Copy는 assign과 다르게 새로운 공간에 데이터를 만들기 때문이다. 객체 얕은 복사 메소드인 Object.assign()의 경우 복사할 target이 될 객체(빈 객체)를 파라미터로 받는 것을 볼 수 있다.

 

assignObj["pro1"] = "TT";
copiedObj["pro2"] = "XX"

//primitive 값 변경
originObj //{pro1: "TT", pro2: "BB", pro3: Array(3), pro4: {…}}
assignObj //{pro1: "AA", pro2: "XX", pro3: Array(3), pro4: {…}}
copiedObj //{pro1: "AA", pro2: "BB", pro3: Array(3), pro4: {…}}

//reference 값 변경
copiedObj["pro3"][0] = "R";
assignObj["pro3"] // ["R", "CC", "CCC"]

할당된 객체로 원본의 속성 값을 변경해보았더니 assign을 통해 변경된 값만 원본에 적용되었다. 이는 assigin은 원본과 완전히 동일하고 copied는 속성의 값만 가져왔기 때문이다. 따라서 원본이 primitive 라면 값이 그냥 value이므로 복사본을 변경해도 원본에 영향이 없다. 그러나 원본 값에 reference를 저장한 경우 복사본이 이를 그대로 가져오므로 복사본을 변경하면 원본에도 적용된다. 할당과 Copy는 비슷하지만 다른 개념임을 알 수 있다.

 

 

2. Shallow Copy vs Deep Copy

Shallow Copy의 경우 위에서 설명하였듯이 새로운 공간을 만들고 원본 property value들을 복사하는 것이다. 즉, 겉 껍데기를 새롭게 만들고 각 속성의 값은 원본에서 그대로 가져온다. 따라서 원본이 primitive 라면 값이 그냥 value이므로 복사본을 변경해도 원본에 영향이 없다. 그러나 reference의 경우 reference값을 가져왔으므로 복사본을 변경하면 원본도 똑같이 변형된다.

 

Deep Copy의 경우 새로운 공간을 만들고 값만 복사하는 것이다. 원본에 Reference type이 있는 경우 안에 있는 값들도 새롭게 복사하여 가져온다. 따라서 객체 내에 reference type이 존재하더라도 복사본을 바꾸었을 때 원본에 영향을 끼치지 않는다.

 

 


참고링크

medium.com/@thawsitt/assignment-vs-shallow-copy-vs-deep-copy-in-python-f70c2f0ebd86

 

Python: Assignment vs Shallow Copy vs Deep Copy

Copying a list in Python might be trickier than you think. There are 3 ways you can do it: simply using the assignment operator (=), making…

medium.com

 

'Web > [JS] Common' 카테고리의 다른 글

논리연산자 AND, OR의 결과값  (0) 2020.12.31
내장고차함수: filter, map, reduce  (0) 2020.12.22
호이스팅(Hoisting)  (0) 2020.12.17
[20201216][이전블로그글]Closure  (0) 2020.12.17
[20201216][이전블로그글]...arg  (0) 2020.12.17
Comments