Widget B = A;
와 같이 B에 A를 복사해줄 수 있다.
<얕은 복사와 깊은 복사를 간략히 보여주는 예>
왼쪽의 얕은 복사는 p와 q가 하나의 메모리를 가리키게 된다.
오른쪽의 깊은 복사는 p와 q가 서로 다른 메모리를 가지도록 복사된다.
여기서 p, q는 포인터라고 생각해도 무방하다.
얕은 복사(Shallow Copy)
Widget B = A;
새 객체 B가 생성되며 A의 필드 값들은 B로 복사된다.깊은 복사(Deep Copy)
class ShallowCopyExam
{
public:
int age;
char* name;
ShallowCopyExam(const ShallowCopyExam& rhs)
{
age = rhs.age;
name = rhs.name;
}
...
};
class DeepCopyExam
{
public:
int age;
char* name;
DeepCopyExam(const DeepCopyExam& rhs)
{
age = rhs.age;
name = new char[strlen(rhs.name) + 1];
// 단순히 주소값을 넣어주는 것이 아니라
// rhs.name의 값을 name에 복사하고 있다.
strcpy(name, rhs.name);
}
...
};
#include <iostream>
#pragma warning(disable:4996)
using namespace std;
class ShallowCopyExam
{
public:
int age;
char* name;
ShallowCopyExam(int _age, const char* _name)
{
age = _age;
name = new char[strlen(_name) + 1];
strcpy(name, _name);
}
/*
* 디폴트 복사 생성자는 아래와 비슷하게 동작하고 있을 것이라고 짐작이 가능하다.
* name에 얕은 복사(rhs.name의 주소값을 넣어줌)가 일어나고 있다.
* 결과적으로 의도한 바와 다르게 name 이 rhs.name 의 '주소'를 참조하고 있다.
* 어떤 이유에서 rhs 객체가 소멸한다면 name 이 가리키는 주소는 더이상 유효하지 않게 될 것이다.
ShallowCopyExam(const ShallowCopyExam& rhs)
{
age = rhs.age;
name = rhs.name;
}
*/
void infoPerson()
{
cout << "이름: " << name << ", ";
cout << "나이: " << age << endl;
}
};
class DeepCopyExam
{
public:
int age;
char* name;
DeepCopyExam(int _age, const char* _name)
{
age = _age;
name = new char[strlen(_name) + 1];
strcpy(name, _name);
}
// 복사 생성자 - 깊은 복사
// 깊은 복사를 위해 복사 생성자를 직접 작성해준다.
DeepCopyExam(const DeepCopyExam& rhs)
{
age = rhs.age;
name = new char[strlen(rhs.name) + 1];
// 단순히 주소값을 넣어주는 것이 아니라
// rhs.name의 값을 name에 복사하고 있다.
strcpy(name, rhs.name);
}
void infoPerson()
{
cout << "이름: " << name << ", ";
cout << "나이: " << age << endl;
}
};
int main()
{
// ---------------------얕은 복사---------------------
ShallowCopyExam human3(30, "세종");
ShallowCopyExam human4 = human3; // 디폴트 복사 생성자가 호출된다.
human4.age = 33;
strcpy(human4.name, "단군");
cout << "<얕은 복사>" << endl;
human3.infoPerson(); // 이름: 단군, 나이: 30
human4.infoPerson(); // 이름: 단군, 나이: 33
// ---------------------깊은 복사---------------------
DeepCopyExam human1(20, "홍길동");
DeepCopyExam human2 = human1; // (깊은) 복사 생성자가 호출된다.
human2.age = 22;
strcpy(human2.name, "이순신");
cout << "<깊은 복사>" << endl;
human1.infoPerson(); // 이름: 홍길동, 나이: 20
human2.infoPerson(); // 이름: 이순신, 나이: 22
}
<얕은 복사>
이름: 단군, 나이: 30
이름: 단군, 나이: 33
<깊은 복사>
이름: 홍길동, 나이: 20
이름: 이순신, 나이: 22
위키피디아 - 객체 복사
제타 위키 - 얕은 복사, 깊은 복사
모두의 코드 C 언어 레퍼런스 - strcpy 함수