[C++] 객체 생성 방법 두 가지 (+ Stack과 Heap)

인트로

C++에서 객체를 생성하는 두 가지 방법에 대해서 알아보려 한다.

 

결론부터 말하면 각각은 서로 다른 결과를 가져오는데 하나는 객체가 에 다른 하나는 스택에 할당된다. 

객체 생성 코드

#include <iostream>

using namespace std;

class Orange
{
private:
	int price;

public :
	Orange(int price)
	{
		this->price = price;
		cout << "[생성자] 오렌지 가격 : " << price << endl;
	}

	~Orange()
	{
		cout << "[소멸자]" << endl;
	}

	void ShowPrice()
	{
		cout << "[가격] 오렌지 : " << price << endl;
	}
};

void Test1()
{
	cout << "*** TEST1 Orange orange(500); ***" << endl;
	Orange orange(500);
	orange.ShowPrice();
}

void Test2()
{
	cout << "*** TEST2 Orange *orange = new Orange(1000); ***" << endl;
	Orange *orange = new Orange(1000);
	orange->ShowPrice();
}

int main(void)
{
	Test1();
	
	Test2();

	return 0;
}

Stack

void Test1()
{
	cout << "*** TEST1 Orange orange(500); ***" << endl;
	Orange orange(500);
	orange.ShowPrice();
}

다음과 같이 인스턴스화 하면 스택 영역에 객체를 할당한 것으로 함수 내에서만 사용 가능하다.

 

스택 영역은 함수의 매개변수지역변수가 할당되는 영역이다.

이러한 변수들은 함수 호출 시 스택에 할당되며 함수 종료 시 자동으로 소멸한다.

Test1 함수에서 별도의 소멸자를 호출하지 않았음에도 자동으로 소멸자가 호출된 것도 이러한 이유 때문이다.

Heap

void Test2()
{
	cout << "*** TEST2 Orange *orange = new Orange(1000); ***" << endl;
	Orange *orange = new Orange(1000);
	orange->ShowPrice();
}

반면 Test2 함수에선 소멸자가 호출되지 않은 것을 확인할 수 있는데 이는 new 키워드가 동적으로 영역에 메모리를 동적으로 할당하기 때문이다. (C의 malloc과 비슷한 맥락이다.)

 

힙 영역은 개발자가 직접 관리하는 메모리 영역으로 new 키워드로 메모리를 할당하고 delete로 해제한다.

일반적으로 동적으로 할당된 메모리는 delete 하기 전까지 힙에 생존한다. 따라서 함수가 종료되어도 소멸자가 호출되지 않는 것은 이러한 이유 때문이다. 

 

객체의 동적할당 과정을 간단히 정리하면

1. 힙의 주소를 가리킬 Orange 포인터 변수를 선언

2. 힙에 객체를 할당

3. 할당된 메모리 주소를 변수에 받기 

new 키워드

Heap에 객체를 할당하는 과정을 보고 new 키워드의 기능을 유추해 볼 수 있다.

 

1. 힙 영역에 동적으로 메모리를 할당한다. (데이터형의 크기만큼)

2. 할당된 메모리 주소를 반환한다.