1. 깊은 복사는 왜 "깊은" 복사인가? ( feat. chatGPT )

2023. 2. 14. 03:02chatGPT와 함께하는 호기심 해결

깊은 복사와 얕은 복사에 대해 알아보던 와중 든 궁금증이 있었다.

깊은 복사 : 객체의 실제 값을 복사함.
얕은 복사 : 객체의 참조값(주소 값)을 복사함.

순간 든 궁금증은 실제 값을 복사하는 것이 왜 "깊은" 복사인가 하는 것이었다.

물론 아닐수도 있겠지만, 주소 값이 실제 값보다 더 깊은? 느낌인데 왜 실제 값이 깊냐고 이야기하는 것이다.

 

구글링을 조금 해봤지만 뭔가 속시원한 해답을 주는 곳은 없었다.(물론 내가 일일이 다 뒤지고 다니지 않아서 그런 것일지도 모른다.)

 

그래서 chatGPT에게 물어보기로 했다.

 

어 뭔가 어려운 말이 나왔다.

원문

최상위 속성? 특성? 객체 계층 구조?

조금 모르는 단어가 나와서 다시 물어보았다.

 

원문

 

const person = {
	name: "John",
    	address: {
    		street: "1st Avenue",
        	city: "New York",
    	}
}

최상위 속성

person의 객체의 속성은 name, address 이다.

설명 상 "단순 복사"는 name과 address "속성"의 새 복사본만 만들고 address 객체의 복사본은 만들지 않는다고 했다.

 

즉, person의 얕은 복사 personCopy의 name값이 변경되면 person.name !== personCopy 이지만,

personCopy의 address 객체의 street의 값이 변경되면 person의 address 객체의 street 의 값이 변경된 다는 이야기였다.


반면 "전체 복사"는 name, address라는 속성과 address 객체의 street, city 속성을 복사한다.

street와 city는 객체가 아니라 문자열이기 때문에 최상위 속성이라 여기까지 복사한다는 것으로 이해했다.

예를 들면 street가 문자열이 아니라 객체였다면 street 객체가 가진 속성을 복사했을 것이다.

 

이렇게 적고보니 chatGPT가 알려준 내용을 되적는 느낌이 들었는데 이해한 대로 나열했다.(생각해보니 지금까지 다른 블로그에서 봤던 얕은 복사, 깊은 복사를 돌고 돌아 이해하는 지점에 온 것 같기도...)

 

단순 복사 = 얕은 복사

전체 복사 = 깊은 복사

 

결국 address 객체가 person 객체의 하위 이기 때문에 

person의 최상위 속성인 name, address 속성을 복사한 것을 "얕은" 복사가 된 것이다. ( 계층 상 address 객체가 있지만 해당 객체까지 복사하지 않음 )

person의 최상위 속성 name, address 속성 + 하위 계층 address 객체의 최상위 속성 street, city 속성을 모두 복사한 것이 "깊은" 복사라는 것이다.

 

여기서 복사는 참조를 하지 않는 별개의 데이터가 되는 것을 말하는 것 같았다.

ㄹㅇ루?

더보기
독립적인 새 개체를 생성하는 것을 의미한다고 한다.

원문

 

혹시나 싶어서 내가 제대로 이해한 것이 맞나 되물어 보았다.

 

오...그렇다고 한다.

원문

알게 된점.

1. 복사는 서로 영향이 없는 새 개체가 생성됨을 의미한다.

2. 깊은 복사의 "깊다"는 계층적인 의미로 객체 안의 객체 안의 속성까지 전부 "복사"한다는 것 ( 뭔가 마트료시카가 생각나는 설명이었다... )

저는 구글 번역기를 애용하기 때문에 혹시라도 이 글을 읽으실(수도 있는) 영어 능력자 분을 위해서 원문까지 첨부했습니다.

또 공부하다가 떠오르는 의문이 있으면 들고 오겠습니다

혹시나 깊은 복사, 얕은 복사에 대해 자세한 설명을 들고오지 않은 이유는 (너무 많아서..) 다른 분들의 글이 너무 훌륭해서 제가 적기에는 어정쩡한 복붙이 될 것 같았기 때문입니다. 순수하게 의문만을 해결하기 위한 포스팅!

 

적고 보니까 제대로 공부하지 않아서 이해를 못했기 때문에 돌고 돌아 원래 의미를 이해한 것 같지만...어쨋든 이해했으니 된게 아닐까?