본문 바로가기

Program Languege/C/C++

얕은 복사, 깊은 복사

얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)

 

 얕은 복사와 깊은 복사는 복사 생성자, 대입 연산자와 관련이 있다. 객체 간에 대입이나 복사에서 일어나는 일이기때문이다.

 

먼저 얕은 복사에대해 설명하면 얕은 복사는 일반적인 값의 복사를 말한다. 클래스에서 기본적으로 제공하는 복사 생성자와 대입 연산자에서 발생하는 현상이다.

 

 

 

 

 

 

기본적으로 제공하는 복사생성자를 사용하는 클래스를 작성하였다.

 

 

 

 

문제 없이 출력이 되는 것을 확인할 수 있다.

 

 

 

 

 test2의 생성과 동시에 test1을 대입하여 복사생성자를 호출하였다.(선언과 동시에 대입하여 초기화하는 경우 복사생성자 호출. 이부분은 나중에 다시 글에 올리겠다.) 이 경우 런타임 오류가 발생한다. test1의 m_c와 test2의 m_c가 같은 객체를 가리키기때문이다. 그래서 같은 메모리를 두번 해제하여 오류가 발생한다.

 

 

 

 

 

위에서 말한 현상을 그림으로 그려보았다. 문제점이 보이는가?

 

 

 

 이번엔 대입 연산자에서 발생하는 얕은 복사의 문제점이다.

 

 

 

이번에도 역시 그림으로 문제를 그려보았다.

 

 

 복사 생성자나 대입연산자의 문제점은 같다. 얕은 복사가 일어나기 때문인데 얕은 복사는 이렇듯 단순히 멤버 변수들의 값만을 복사하는 것을 말한다. 이때 참조를 하고 있는 멤버가 있는 경우 위와 같은 문제가 발생한다. 단순히 주소 값을 복사해버리기 때문에 같은 메모리 공간을 가리키게되어 문제가 발생하는 것이다. 이는 기본 제공하는 복사생성자나 대입 연산자를 사용하지 않고 오버로딩하여 직접 어떻게 복사를 해야하는지를 작성하여주면 된다.

 

 

 

 

 

 

 

 이전에 작성한 cShallowCopy클래스에서 복사 생성자와 대입 연산자를 추가하였다. 복사 생성자와 대입 연산자를 보면 메모리를 할당하여 복사하려는 객체의 멤버 포인터가 가리키는 곳의 값을 복사하였다. 위와 같이 참조를 하고 있는 경우에 새로 대상을 만들어 복사해주는 것을 깊은 복사라고 한다.

 

 

 

 

 

main.cpp와 실행화면은 위와 같다. 각각 다른 공간을 할당하여 가리키고 있고 종료 후 각각 가리키는 곳을 해제하기때문에 문제가 발생하지 않는다.

 

 

 

 

 

얕은 복사의 문제점을 해결한 깊은 복사의 상황을 그림으로 그려보았다. 안에 쓰레기 값이 아닌 제대로 된 값을 넣어주고 했어야하지만 예제이기때문에 간단히 문제점만을 지적하고 넘어갔다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Program Languege > C/C++' 카테고리의 다른 글

호출 규약  (0) 2014.03.25
Console  (0) 2014.03.05
const의 선언 위치  (0) 2014.02.20
템플릿 - 4  (0) 2013.03.19
템플릿 - 3  (0) 2013.03.19