깊은 복사를 설명하기 위하여 일단은 얕은 복사와의 차이점의 개념을 잡고가야합니다!.
그것은 바로 얕은 복사는 포인터 값 즉, 주소만을 복사되는 것이며,
깊은 복사는 값 자체를 복사하여 해당하는 것에 복사를 한다는 의미로 보면 될 것 입니다.
무슨 말이냐구욤?!
하하.... 말이 필요할까욤?
간단한 예제소스 들구왔습니다~
//먼저 얕은복사
#include <iostream>
#include <cstring>
using namespace std;
class Test
{
private:
char *name;
char *address;
public:
Test(char *_name, char *_address)
{
name = new char[strlen(_name)+1];
strcpy(name, _name);
address = new char[strlen(_address) + 1];
strcpy(address, _address);
}
void Show_Data(void)
{
cout << name << endl;
cout << address << endl;
}
~Test()
{
delete []name;
delete []address;
}
};
int main(void)
{
Test *test1 = new Test("홍길동", "아무개시 아무개동 아무개번지에살고 있음");
Test test2(*test1);
test1->Show_Data();
test2.Show_Data();
delete test1;
test2.Show_Data();
return 0;
}
와 같이 코딩을 하게 되었을 시 에러 없이 구동은 되나 아래와 같은 화면을 확인할 수 있을 것입니다.
이 메시지가 무엇을 뜻하는지 고민해본다면 아마 머리가 엄청나게 아파올 수도 있기에 간단하게 설명을 하자면,
test2.Show_Data();
delete test1;
test2.Show_Data();
여기 부분에서 test1에 할당 되었던 메모리가 해제된 상태입니다.
하지만 이러한 문제를 확인하기 위하여 test1의 메모리를 해제 한 후
다시 한번 호출하여 출력하여 봤더니 알 수 없는 메시지와 경고창이 뜨게 된 것인데요.
이것이 바로 test1의 메모리가 해제 되었음에도 불구하고
test2는 여전히 test1의 주소를 가르키고 있기 때문이라고 설명할 수 있을 것입니당.
이러한 옅은 복사의 단점(약점이라고 표현하고 싶음)을 해결해주는데 있어서
필요한 것이 바로 값을 그대로 저장해오는 깊은 복사의 개념인 것입니다다.
깊은 복사의 간단한 예제는 다음과 같습니다~
//깊은 복사.
#include <iostream>
#include <cstring>
using namespace std;
class Test
{
private:
char *name;
char *address;
public:
Test(char *_name, char *_address)
{
name = new char[strlen(_name)+1];
strcpy(name, _name);
address = new char[strlen(_address) + 1];
strcpy(address, _address);
}
Test(const Test ©)
//참조해라 무엇을? Test에 있는 값들을!!
//참조자는 변수를 통하여 참조할 수 있다고 해놓고라고 생각하고 있다면, 정리된
//내용들 중에서 const를 이용하여 참조자를 변수가 아닌 값을 참조 할 수 있게 해줄
//수 있다는 설명을 본 사람에 한해서는 이해가 가능할 것이다. 만약에라도 보지 못한
//사람들이라면 const부분의C 레퍼런스형 매개 변수을 참고하면 될 것이다.
//이렇게 const를 사용하여 참조하게 되면 위의 메시지창은 사라지게 되는 것이다.
//이것이 바로 얕은복사의 단점을 보안해주는 깊은복사의 사용방법 및 사용 이유이다.
{
name = new char[strlen(copy.name)+1];
strcpy(name, copy.name);
address = new char[strlen(copy.address)+1];
strcpy(address, copy.address);
}
void Show_Data(void)
{
cout << name << endl;
cout << address << endl;
}
~Test()
{
delete []name;
delete []address;
}
};
int main(void)
{
Test *test1 = new Test("홍길동", "아무개시 아무개동 아무개번지에살고 있음");
Test test2(*test1);
test1->Show_Data();
test2.Show_Data();
delete test1;
test2.Show_Data();
return 0;
}
와 같이 test1의 메모리가 해제 되었음에도 불구하고 얕은복사와는 다르게
정상적으로 복사했던 값이 출력하는 것을 확인 할 수 있을 것입니다~
한번 보고 이해하는 분은 천재!!!
만약 조금이라도 흠... 하신다면 다른 깊은복사와 얕은복사의 소스들과 글들을 보면 개념을 확실히 잡아주세요!!!!
중요합니다!!! ㅎㅎ
자~ 그럼 이번 글은 여기까지 하도록 할께욤~~ 씨~~~ 유~~~
'지식창고 > 프로그래밍' 카테고리의 다른 글
(C++)클래스의 소멸자란? (0) | 2019.07.24 |
---|---|
(C++)디폴트 생성자란? (0) | 2019.07.24 |
(C++)묵시적 변환이란? (0) | 2019.07.18 |
(C++)클래스의 정보은닉이란? (0) | 2019.07.15 |
(C++)클래스의 private의 사용방법과 접근 방법 (0) | 2019.07.14 |