C++에서는 클래스 객체를 두 가지 방식으로 인스턴스화할 수 있습니다. 하나는 new 키워드 없이 일반 변수처럼 선언하는 방법이고, 다른 하나는 new 연산자를 사용해 동적으로 메모리를 할당하는 방법입니다. 두 방식은 메모리가 저장되는 위치와 객체의 수명에서 중요한 차이를 보입니다.
new를 사용하지 않는 경우: 스택(Stack) 할당
new를 사용하지 않고 객체를 생성하면, 해당 객체는 스택(stack) 영역에 저장됩니다. 이렇게 생성된 객체는 자신이 선언된 스코프(scope)가 끝나는 순간 자동으로 소멸되기 때문에, 개발자가 별도로 메모리를 해제할 필요가 없습니다. 관리가 간편하고 속도도 빠르다는 장점이 있습니다.
new를 사용하는 경우: 힙(Heap) 동적 할당
반면, 프로그램 실행 중에 필요한 만큼 메모리를 유연하게 확보하고 싶다면 클래스 타입의 포인터를 선언하고 new 연산자로 객체를 생성하면 됩니다. 이 경우 객체는 힙(heap) 영역에 할당되며, 스코프가 종료되어도 자동으로 소멸되지 않습니다. 즉, C++에서 new는 메모리를 동적으로 할당하는 역할을 하며, 개발자가 명시적으로 delete를 호출하기 전까지 객체는 메모리에 유지됩니다.
예제 코드
#include <iostream>
using namespace std;
class Point {
int x, y, z;
public:
Point(int x, int y, int z) {
this->x = x;
this->y = y;
this->z = z;
}
void display() {
cout << "(" << x << ", " << y << ", " << z << ")" << endl;
}
};
int main() {
Point p1(10, 15, 20); // 스택에 객체 생성
p1.display();
Point *ptr; // 포인터 선언
ptr = new Point(50, 60, 70); // 힙에 동적 할당
ptr->display();
}
실행 결과
(10, 15, 20) (50, 60, 70)
주의 사항 및 추가 팁
new로 할당한 메모리는 자동으로 해제되지 않으므로, 사용이 끝난 후 반드시 delete ptr;을 호출해야 합니다. 이를 누락하면 메모리 누수(memory leak)가 발생할 수 있습니다.
현대 C++(C++11 이상)에서는 이러한 실수를 방지하기 위해 std::unique_ptr, std::shared_ptr 같은 스마트 포인터(smart pointer)를 사용하는 것이 권장됩니다. 스마트 포인터는 객체가 더 이상 필요하지 않을 때 메모리를 자동으로 해제해 주므로, 안전하고 관리하기 쉬운 코드를 작성할 수 있습니다.
정리
- new 미사용: 스택 할당, 스코프 종료 시 자동 소멸, 관리 편리
- new 사용: 힙 동적 할당, 수명을 개발자가 제어, 반드시 delete 필요
- 객체의 크기가 크거나 생명 주기를 함수 범위 밖으로 연장해야 한다면
new(또는 스마트 포인터)를 활용하는 것이 적합합니다.