new 연산자는 힙(heap) 영역에 메모리 할당을 요청하는 C++의 동적 메모리 할당 연산자입니다. 요청한 크기의 메모리가 충분히 남아 있다면, 해당 메모리를 초기화한 뒤 그 시작 주소를 포인터 변수에 반환합니다.
new 연산자는 delete로 명시적으로 해제할 때까지 객체를 메모리에 유지해야 하는 경우에만 사용하는 것이 좋습니다. 반대로 new를 사용하지 않고 일반 변수나 객체를 선언하면, 해당 객체는 자신이 선언된 범위(scope)를 벗어나는 순간 자동으로 소멸됩니다. 즉, new로 생성한 객체는 프로그래머가 직접 해제해 주어야 하고, 그 외의 객체는 범위를 벗어날 때 자동으로 정리됩니다.
new 연산자의 기본 문법
pointer_variable = new datatype;
여기서 pointer_variable은 할당된 메모리의 주소를 받을 포인터 변수이며, datatype은 메모리에 저장할 기본(built-in) 데이터 타입입니다.
예제 코드
다음 프로그램은 new 연산자의 실제 사용 방법을 보여줍니다.
#include <iostream>
using namespace std;
int main () {
int *ptr1 = NULL;
ptr1 = new int;
float *ptr2 = new float(223.324);
*ptr1 = 28;
cout << "Value of pointer variable 1 : " << *ptr1 << endl;
cout << "Value of pointer variable 2 : " << *ptr2 << endl;
delete ptr1;
delete ptr2;
return 0;
}실행 결과
위 프로그램의 출력 결과는 다음과 같습니다.
Value of pointer variable 1 : 28 Value of pointer variable 2 : 223.324
코드 설명
위 코드에서 new 연산자는 메모리를 할당하고 초기화한 뒤, 그 주소를 포인터 변수 ptr1과 ptr2에 반환합니다. 이후 ptr1과 ptr2가 가리키는 메모리 위치에 저장된 값을 화면에 출력하고, 마지막으로 delete 연산자를 사용해 할당된 메모리를 해제합니다.
핵심 부분을 발췌하면 다음과 같습니다.
int *ptr1 = NULL; ptr1 = new int; float *ptr2 = new float(223.324); *ptr1 = 28; cout << "Value of pointer variable 1 : " << *ptr1 << endl; cout << "Value of pointer variable 2 : " << *ptr2 << endl; delete ptr1; delete ptr2;
정리 및 추가 팁
정리하면, 객체의 수명을 프로그래머가 직접 제어해야 하거나 함수가 종료된 후에도 데이터를 유지해야 한다면 new를 사용하고, 객체가 선언된 범위 내에서만 필요하다면 new 없이 일반 변수로 선언하는 것이 안전합니다.
또한 최신 C++(C++11 이상)에서는 raw 포인터와 new/delete 조합 대신 스마트 포인터(std::unique_ptr, std::shared_ptr)를 사용하는 것이 권장됩니다. 스마트 포인터는 범위 기반 규칙이나 참조 횟수에 따라 메모리를 자동으로 해제해 주므로, 메모리 누수(memory leak)나 댕글링 포인터(dangling pointer) 같은 오류를 크게 줄일 수 있습니다.