본문 바로가기

지식창고/프로그래밍

(C++)클래스의 깊은 복사란?

반응형

깊은 복사를 설명하기 위하여 일단은 얕은 복사와의 차이점의 개념을 잡고가야합니다!.

 

그것은 바로 얕은 복사는 포인터 값 즉, 주소만을 복사되는 것이며, 

깊은 복사는 값 자체를 복사하여 해당하는 것에 복사를 한다는 의미로 보면 될 것 입니다.

 

무슨 말이냐구욤?!

 

하하.... 말이 필요할까욤? 

 

간단한 예제소스 들구왔습니다~

 

//먼저 얕은복사

#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 &copy)

//참조해라 무엇을? 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의 메모리가 해제 되었음에도 불구하고 얕은복사와는 다르게

정상적으로 복사했던 값이 출력하는 것을 확인 할 수 있을 것입니다~

 

한번 보고 이해하는 분은 천재!!!

 

만약 조금이라도 흠... 하신다면 다른 깊은복사와 얕은복사의 소스들과 글들을 보면 개념을 확실히 잡아주세요!!!!

중요합니다!!! ㅎㅎ

 

자~ 그럼 이번 글은 여기까지 하도록 할께욤~~ 씨~~~ 유~~~

반응형