거의 알고리즘 일기장

얕은 복사와 깊은 복사 본문

c++ 문법

얕은 복사와 깊은 복사

건우권 2020. 4. 5. 21:05

1. 얕은 복사와 깊은 복사가 필요한 이유

 

 일반적으로 객체를 복사할때는 새로운 객체를 만들어서 그 안에 복사할 객체들을 복사한다.

이때 밑의 그림과 같은 오해를 할수도 있다

B = A로 복사할때 할수 있는 오해

 

 

 

 하지만, 참조된 값을 복사하면 밑의 그림과 같이 저런식으로 참조값만 복사가 된다.

B = A의 올바른 형태

 

 이게 뭐가 문제냐?? 라고 생각할수도 있지만 충분히 문제가 생길수 있다.

 

 예를들면 만약 하나의 클래스가 있고 A와 B는 그 클래스의 인스턴스이다. 그리고 B는 A의 값을 복사했다. 

 

 이때 소멸자에 클래스 포인터 변수를 delete 시켜주는 기능이 있다면 A가 소멸할땐 문제가 없겠지만 뒤이어 B가 소멸할때 분명히 에러가 날것이다. ( 밑의 코드 참조 )

 

#include <iostream>

using namespace std;

class A
{
public:
	int value;
	char* name;

public:
	A(int value_in, const char* name_in)
	{
		value = value_in;
		name = new char[strlen(name_in) + 1];
		strcpy_s(name, strlen(name_in)+1, name_in);
	}

	~A()
	{
		cout << "destructor" << endl;
		delete name;
	}
	void ShowA()
	{
		cout << "value : " << value <<endl;
		cout << "name : " << name << endl;
	}
};

int main()
{
	A a1(5, "jackjack");
	A a2 = a1;

	a1.ShowA();
	a2.ShowA();

	return 0;
}

 


 

2. 깊은 복사

 

 이제 이 문제를 어떻게 해결하면 좋을까?

 

 바로 복사할때 이 형태를 만들면 된다. ( 밑의 코드 참조 )

 

#include <iostream>

using namespace std;

class A
{
public:
	int value;
	char* name = nullptr;

public:
	A(int value_in, const char* name_in)
	{
		value = value_in;
		name = new char[strlen(name_in) + 1];
		strcpy_s(name, strlen(name_in) + 1, name_in);
	}

	//대입 생성자 , 깊은 복사
	A(const A& a)
	{
		value = a.value;
		name = new char[strlen(a.name) + 1];
		strcpy_s(name, strlen(a.name) + 1, a.name);
	}

	~A()
	{
		cout << "destructor" << endl;
		delete name;
	}

	//대입 연산자 수정
	A& operator =(const A& a)
	{
		if (name != nullptr)
			delete name;

		value = a.value;
		name = new char[strlen(a.name) + 1];
		strcpy_s(name, strlen(a.name) + 1, a.name);
	}

	void ShowA()
	{
		cout << "value : " << value << endl;
		cout << "name : " << name << endl;
	}
};

int main()
{
	A a1(5, "jackjack");
	A a2(a1);

	a1.ShowA();
	a2.ShowA();

	return 0;
}

 

 


 

3. 후기

 

나도 까먹었어서 공부할겸 포스팅했다. 블로그에 글을 쓰는게 시간이 좀 걸리긴 하지만 공부에 도움이 되는것 같다. 

 

 이 포스트는 개인공부용으로 작성하였습니다.

 미숙해서 틀린부분이 있을수도 있는데 말해주시면 수정하겠습니다.

반응형
Comments