인프런 커뮤니티 질문&답변

이종성님의 프로필 이미지

작성한 질문수

웹 게임을 만들며 배우는 React

7-3. action 만들어 dispatch 하기

얕은복사 깊은 복사에 관한 얘기

21.07.31 23:56 작성

·

479

0

강의를 듣다가 궁금증이 생겨 여쭤봅니다. 
제가 알기론 불변성을 해치지 않기 위해서는 "깊은복사" 를 해야한다고 알고 있습니다.  복사한 객체가 변하더라도 원본객체는 변하지 않아야 하니까요. 따라서 보여주신 예시( 전개구문을 활용; a === b ; false ) 등을 보여주신 것 또한 깊은복사의 예시였습니다. 다만 말씀하실 때 얕은 복사를 해야 불변성을 해치지 않는다고 하셔서, 제가 느끼기엔 의아해서 질문을 남깁니다. 혹여 제가 잘못 알고 있으면 알려주시면 감사하겠습니다. 

좋은 강의 잘 듣고 있습니다. 감사합니다.

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2021. 08. 01. 11:42

[a, b, c] (a,b,c 모두 객체)가 있을 때 c를 바꾸는 경우 c와 최상단 []는 복사해야하고 a, b는 참조로 놔두면 됩니다. 즉 []를 얕은 복사 후 c만 복사(이것도 얕은복사일지 아닐지는 그 내부 상황에 따라 다릅니다)하면 됩니다.

이종성님의 프로필 이미지
이종성
질문자

2021. 08. 02. 10:21

"변경하고자 하는 객체는 깊은 복사를 하고 변경하지 않아도 되는 객체는 얕은 복사한다." 
이렇게 이해해도 될까요?

제가 말꼬리를 잡는거처럼 보이실수도 있겠지만, 제가 알고있는 개념이 약간 흔들려서 계속 질문드립니다.

제가 알고있는 얕은 복사에 대한 개념은 '얕은복사는 원본객체의 메모리 주소를 참조하고있기 때문에 복사한 객체를 변경할경우, 원본객체도 변경된다.' 라는 겁니다. 하지만 이러한 얕은 복사는 강사님께서 말씀하신 불변성을 지키는 것이 아닌 해치는 것입니다. 현재 거기서 혼동이 오고 있습니다. 제가 알고있는 개념과는 상이해서 말이죠. 

전개구문이 2depth 이상일경우 얕은 복사가 되는 것은 알고 있습니다. 전개구문의 원리가 iterable 로 원본객체를 순회하면서 안에 요소를 복사하는 것이기 때문입니다. 그렇기에 요소가 객체형일 경우 얕은 복사가 되는 것이지요. 다만, 강사님께서는 2depth인 배열(2차원 배열) 에 접근할때 2차원 배열에 index(1차원 배열) 로 접근하기 때문에 결국 1depth 형태로 전개구문을 사용하여 저는 이를 "깊은 복사"라 생각했습니다. 하지만 강사님께서 이를 두고 "불변성을 위해 얕은 복사 를 한다." 라는 말씀이 헷갈렸습니다.

거듭 말꼬리를 잡는 것 같아 죄송합니다. 다만 제가 개념을 잘못알고있나 라는 생각이 들어 긴글 남깁니다.

긴글 읽어주셔서 감사합니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2021. 08. 02. 10:53

일단 얕은 복사와 참조를 혼동하고 계십니다. 원복객체의 메모리 주소를 참조하는 건 참조이고, 얕은 복사는 최상위 객체의 참조를 끊는 게 얕은 복사입니다. 얕은복사로도 불변성을 안 해칠 수 있습니다.

깊은 복사는 내부 객체까지 전부 다 새걸로 바꾸는 겁니다. [a,b,c]에서 a,b,c 전부 다 바꾸는 게 깊은 복사인데 그건 아니므로 깊은 복사가 아닙니다. 그냥 얕은 복사인 셈이고, 바뀌는 c같은 것은 다시 또 얕은 복사하는 겁니다.

이종성님의 프로필 이미지
이종성
질문자

2021. 08. 02. 11:06

답변감사합니다!