기술 면접 대비 1탄 - 얕은 복사 vs 깊은 복사

양진영·2022년 4월 11일
0

어떤 언어로 프로그래밍을 하던 어떤 값을 변수에 담아 복사 하는 기능이 존재할 것이다. 변수에 담아 복사한 값을 다른 조건에 맞게 가공 하고 싶다면 그리 하면된다, 그리고 문법적으로 그리고 논리적으로 문법적으로 오류만 없다면 변수에 담긴값은 제대로 가공되었을 것이다. 하지만 우리가 신경써야 할 부분은 복사본이 아니라 원본이다. 과연 복사본을 가공 했을때 복사본만 바뀌었을 것인가, 아니면 원본도 같이 바뀌었을 것인가? 만약 원본까지 변경됫을 경우 우리는 복사본이 얕은복사 되었다고 말할수 있고 원본이 변경되지 않았다면 깊은 복사가 되었다고 할수있다.

얕은복사: 기본적으로 우리가 복사를 하여 안에 담긴 값을 가공할때 우리는 복사본만 바뀔것을 기대하지만 원본까지 바뀐다. 이유는 무엇일까? 이유는 복사본과 원본 둘다 같은 메모리값을 사용하고 있기 때문이다. 쉽게 말해 같은 주소를 사용하고 있다고 보면 쉬울것이다. 복사본의 주소를 바꿔 주소에 담긴 값이 달라진다면 같은 것을 바라보고 있던 원본마저 달라질것이다. 이것이 복사본을 바꾸면 원본도 달라지는 이유이다.

깊은복사: 얕은 복사와는 달리 복사본은 원본과 독립적인 메모리를 갖는다. 따라서 복사본이 달라져도 원본과 복사본은 같은 주소를 공유하고있는것이 아니기에 복사본만 달라진다.

  • 기본적은 data type인 primitive data type(string, number, boolean etc...) 는 자기 자신만의 주소값을 갖기 때문에 깊은복사가 된다.
  • composite data type(array obejct)는 주소값을 공유 하기 때문에 원본과 복사본은 기본적으로 얕은복사가 된다.

그러면 composite data type을 어떻게 깊은 복사를 할수 있을까? 답은 JS기준으로 JSON.stringify()후 JSON.parse()를 해주면 된다.

별거 아닌것 같지만 예전 elastic search로 데이터를 필터링 해주기 위해 받아오는 과정에서 맘대로 가공이 안돼서 의아했던 경험이 있는데 그때 깊은복사가 안돼서 그랬던 기억이 있어 간단하게 짚고 넘어가고자 정리해 보았다.

profile
왜? 라는 질문을 중요시하는 서버 개발자입니다

0개의 댓글