깊은 복사 얕은 복사

tahn·2022년 11월 24일
0

C++

목록 보기
4/8
post-thumbnail

들어가기에 앞서..

복사생성자에 대한 개념을 알아야 합니다.

복사생성자란

다른 객체로 부터 값을 복사해서 새로운 객체를 초기화 하는데 사용되는 생성자를 말합니다.

복사생성자를 따로 정의 하지 않으면 컴파일러가 자동으로 만들어주며, 기본적으로 자신과 동일한 타입의 객체에 대한 레퍼런스(&)를 인자로 받는 생성자입니다.

복사생성자 : 얕은 복사

class ExClass
{
public:
		string name;
        int age;
        
        ExClass(const ExClass& c)
        {
        	name = c.name;
            age = c.age;
         }
};

int main()
{
		ExClass c1;
    	ExClass c2 = c1;
}

ExClass 라는 클래스가 있다고 할 때,
c2에 c1을 넣게되면 복사생성자가 호출됩니다.

이때는 값을 복사하는게 아닌, 주소값을 복사하게 되고, 이를 얕은 복사(Shallow Copy)라고 합니다.

주소값만을 복사하기에 메모리상에 큰 부담 없이 복사 및 수정이 가능하지만, 몇가지 문제점이 발생합니다.

  1. c1을 delete 한 뒤 c2에 접근하려 한다면 delete 된 힙 영역에 접근하는 문제가 발생합니다.

  2. (장점이자 단점) 두 객체의 포인터 변수가 같은 메모리 공간을 참조하기에 어느 한 곳에서 값을 변경하면 변경된 값이 모두에게 반영된다.

위 두가지 문제는 얕은 복사만의 문제는 아니고 포인터를 다루는 대부분의 상황에서 발생 할 수 있는 문제들입니다.

위와같은 문제가 생기는 경우를 위해 깊은 복사(Deep Copy) 를 사용합니다.

class ExClass
{
public:
		string name;
        int age;
        
        ExClass(const ExClass& c)
        {
        	**strcpy(name, s.name);
            **age = c.age;
         }
};

int main()
{
		ExClass c1;
    	ExClass c2 = c1;
}

위와같이 strcpy로 값을 복사할 경우 복사생성자가 호출되며 깊은복사(Deep Copy) 가 진행됩니다.

1번 문제였던 delete 로부터 자유로워 질 수 있고, 2번 문제였던 참조했던 값의 변경으로부터 또한 자유로워 질 수 있습니다.

정리하면 아래와 같습니다.

깊은 복사(Deep Copy) 는 '실제 값을 새로운 메모리 공간에 복사 하는 것
얕은 복사(Shallow Copy) 는 '주소 값'을 복사한다는 것을 의미한다.

profile
html 개발자

0개의 댓글