본문 바로가기

강의자료/C/C++

040. 클래스의 객체를 동적으로 생성하자.


◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


여기서는 클래스의 객체를 동적으로 생성하는 방법을 알아본다.
동적으로 생성한다는 의미는 프로그램이 시작할 때 객체를 미리 생성해두는 것이 아니라 그 객체를 필요로 하는 순간에 바로 생성한다는 뜻이다.
// 객체의 동적생성에 대한 이해를 한다.
/*
	int* a = new int; // new int(100);
	Point* pt = new Point;	// 기본생성자가 없을 경우 에러발생.
	Point* pt2 = new Point(3,5);	//객체 생성시 생성자에 입력값을 넘겨준다.
	
	// 힙에 생성되는 변수(객체)는 이름이 존재하지 않으므로, new 연산자가 리턴하는 메모리의 주소를
	// 반드시 기억하고 있어야 한다. 여기에는 당연히 포인터가 사용이 된다.
*/
// 배열의 동적생성에 대한 이해를 한다.
/*
	int ary[2] = {1,2}	// 가능.
	Point one = {1,2} // 생성자가 없을 경우에만(기본생성자 포함) 가능.
	Point ary[2] = {{1,2}, {2,3}};	// 불가능.
	Point ary[2] = {Point(1,2), Point(2,3)};	// 가능.
	Point* ary = new Point[2]{Point(1,2), Point(2,3)};	// 불가능.
	
	// 힙에 생성하는 배열은 그 크기(변수사용)를 미리 알 수 없으므로 초기값을 넣어줄 수 없다.
	// 그러므로, 힙에 배열형태로 생성하는 객체의 클래스는 반드시 기본생성자를 가져야 한다.
*/

#include 
using namespace std;

class Point  
{
private:
	int x;
	int y;

public:
	Point(int _x, int _y);
	~Point();

	void position();
	void move(int _x, int _y);
};

Point::Point(int _x, int _y)
{ 
	x=_x;  
	y=_y;
}

Point::~Point()
{
	cout << "Point die~~." << endl;                
}

void Point::position()
{
	cout << "(" << x << " , " << y << ")" << endl;     
} 

void Point::move(int _x, int _y)
{
	x+=_x;  //_x만큼 이동  
	y+=_y;  //_y만큼 이동     
}

int main()
{
	Point* p2=new Point(5,8);  //힙에 객체 생성 
	Point* p4;  //*는 주소이므로 객체를 생성하지 않는다. 
	p4=p2;  //얕은 복사 
	p2->position();
	p2->move(4,5);  //(5, 8)를(4, 5)만큼 이동  
	p2->position();
	p4->move(3, 6);
	p2->position(); 
	
	cout << "p2의 크기 " << sizeof(p2) << " byte" << endl; 
	cout << "p2의 주소 " << &p2 << ", p2의 값  " << p2 << ", p2가 가리키는 객체의 크기 " << sizeof(*p2) << " byte" << endl; 

	Point p1(2,7);
	cout << "p1의 주소 " << &p1 << ", p1의 크기 " << sizeof(p1) << " byte" << endl; 
	//cout << ", pt1의 값  " << p1 << endl;		// <-- 에러.

	delete p2;  //같은 객체를 참조 p4로 지우면 안됨 (2번 제거 못함) 
	return 0;
}