C++ 얕은복사, 깊은복사 (Shallow Copy,Deep Copy)

2022. 3. 23. 16:05기술 면접

기본적으로 객체를 생성하고 초기화 시킬 때 멤버 변수를 어떻게 초기화하느냐에 따라 깊은 복사가 될 수 있고, 얕은 복사가 될 수 있다.

얕은 복사(Shallow Copy)

객체가 가진 멤버들의 값을 새로운 객체로 복사하는데 만약 객체가 참조타입의 멤버를 가지고 있다면 참조값만 복사가 된다. 또한 동적 할당을 받은 변수의 주소값을 공유한다. 즉 포인터 변수를 얕은 복사할 경우 새로운 포인터 변수는 기존 주소값을 가르키게 된다.

이 얕은 복사의 문제점은 프로그램이 종료되면서 객체의 포인터 변수가 소멸자에 의해 소멸되는데, 이때 복사된 객체가 소멸될 때 같은 주소를 공유하고 있던 원본이 소멸되었기 때문에 영역 침범이라는 에러가 발생하게 된다. 이를 해결하는 방법이 깊은 복사이다.  

 

깊은 복사(Deep Copy)

깊은 복사 또는 전체 복사라고도 한다. 얕은 복사와 달리 객체가 가진 모든 멤버(값,참조형식)를 복사하는 것을 말한다.

객체가 참조 타입의 멤버를 포함할 경우에는 참조값의 대한 복사가 아닌 참조된 객체 자체가 복사되는 것이다.

깊은 복사의 경우 새로이 동적 할당을 받고, 원본의 데이터까지 복사한다.

 

 

얕은복사와 깊은복사를 설명해보세요.

C++을 기준으로 설명드리겠습니다. 기본적으로 객체를 생성하고 초기화 시킬 때 멤버 변수를 어떻게 초기화 하냐에 따라 깊은복사가 될 수 있고 얕은 복사가 될 수 있습니다. 얕은 복사는 동적 할당을 받은 변수의 주소값을 공유가 되도록 복사하는 방법입니다. 다만 프로그램이 종료될 때 복사된 객체가 이미 소멸된 포인터 변수를 소멸시킬 때 영역 침범이라는 에러가 발생되기 때문에 새로이 동적 할당을 받고, 원본의 데이터 까지 복사되는 깊은 복사를 사용하는 것입니다.