[C++] 객체 지향 프로그래밍 - 얕은 복사, 깊은 복사

Taeil Nam·2022년 11월 3일
0

C++

목록 보기
9/13
post-thumbnail

복사 생성자 (Copy Constructor)

  • 새로운 객체를 생성할 때, 다른 객체의 값을 복사하여 새로운 객체를 초기화 해주는 생성자.
  • 기본적으로, 자기 자신의 클래스를 참조로 받는다.
  • 복사 생성자가 클래스에 정의되어 있지 않은 경우, 컴파일러가 자동으로 만들어줌.

얕은 복사 (Shallow Copy)

  • 복사 생성자로 만들어진 객체들의 멤버 포인터 변수 값이 동일함.
  • 객체들이 사용하는 포인터 변수의 메모리 주소가 동일하므로, Use-After-Free와 같은 문제점 발생 가능.

예제 코드

#include <iostream>

using namespace std;

class Pet	// Knight 클래스의 멤버 클래스 Pet
{
public:
	int _hp = 10;
};

class Knight	// Knight 클래스
{
public:
	Knight()	// 기본 생성자
	{
		_pet = new Pet();	// Pet 객체를 동적 할당 받아서 저장.
	}

	Knight(const Knight& knight)	// 복사 생성자
	{
		_pet = knight._pet;	// 기존 객체의 _pet 값을 복사하여 저장.
	}

	~Knight()	// 소멸자
	{
		delete _pet;
	}
public:
	Pet* _pet;	// Pet 클래스를 멤버로 가짐.
};

int main()
{
	Knight k1;		// 기본 생성자로 k1 객체 생성.
	Knight k2(k1);	// 복사 생성자로 k2 객체 생성.

	return 0;
}

결과

  • 각각의 k1, k2 객체가 가리키는 _pet의 주소가 동일함.

깊은 복사 (Deep Copy)

  • 복사 생성자로 만들어진 객체들의 멤버 포인터 변수 값이 각각 다름.
  • 각 객체들의 멤버 포인터 변수가, 서로 다른 메모리 주소를 가지고 있음.
  • 얕은 복사의 문제 해결.

예제 코드

#include <iostream>

using namespace std;

class Pet	// Knight 클래스의 멤버 클래스 Pet
{
public:
	int _hp = 10;
};

class Knight	// Knight 클래스
{
public:
	Knight()	// 기본 생성자
	{
		_pet = new Pet();	// Pet 객체를 동적 할당 받아서 저장.
	}

	Knight(const Knight& knight)	// 복사 생성자
	{
		_pet = new Pet();	// 새로운 Pet 객체를 동적 할당 받아서 저장.
	}

	~Knight()	// 소멸자
	{
		delete _pet;
	}
public:
	Pet* _pet;	// Pet 클래스를 멤버로 가짐.
};

int main()
{
	Knight k1;		// 기본 생성자로 k1 객체 생성.
	Knight k2(k1);	// 복사 생성자로 k2 객체 생성.

	return 0;
}

결과

  • 각각의 k1, k2 객체가 가리키는 _pet의 주소가 서로 다름.

0개의 댓글