본문 바로가기

전자 공학/C언어 C++

[C++ 독학하기] 3. new와 delete 연산자에 대한 개념

반응형

안녕하세요. 취업한 공대누나입니다.

오늘은 new와 delete의 개념에 대해 공부해보도록 하겠습니다.

할당에 대한 개념을 먼저 잡고 들어가겠습니다.


1. 개념

new와 delete는 C++에서 객체를 동적 할당하고 해체하는 '연산자'입니다.

 

C++에는 세 가집 타입의 메모리 할당이 있습니다.

1) 정적 메모리 할당(static memory allocation)은 정적 변수와 전역변수에 대해 발생하는 것으로 프로그램이 실행될 때 한 번 할당되며, 프로그램 수명 내내 지속하게 됩니다.

2) 자동 메모리 할당(auto memory allocation)은 함수 매개변수와 지역 변수에 대해 발생하는 것으로 이러한 타입의 변수에 대한 메모리는 관련 블록을 입력할 때 할당되고, 블록을 종료할 때 필요에 따라 여러 번 해제됩니다.

3) 동적 메모리 할당(dynamic memory alloctaion)은 프로그램 실행 중에 필요한 메모리를 할당하는 것입니다. 동적 할당을 할 경우 사용자가 해체하기 전까지 메모리 공간이 계속 유지가 됩니다. 그리고 동적으로 할당한 변수는 반드시 해체해줘야 합니다. 해체를 시켜주지 않으면 프로그램이 끝날 때까지 계속 메모리에 있게 됩니다. 또한 동적 메모리는 프로그램의 제한된 스택 메모리에서 할당되는 것이 아니라 힙(heap)이라는 운영체제에서 관리하는 메모리 영역에서 할당이 되게 됩니다.

 

C언어에서는 malloc과 calloc 함수로 동적 할당을 진행합니다.

malloc 함수의 인수로 크기값을 넘겨 요청하면 힙영역관리 함수가 영역을 확보합니다. new와 delete 연산자는 내부에서 malloc과 free 함수를 호출합니다.

new 연산자와 malloc() 함수와 비교했을 때의 차이점 중 하나는 '메모리의 크기를 정하지 않는다'라는 것입니다. 자료의 '형식'에는 필요한 메모리 크기도 포함이 되는데요. 그런데 문제는 형식에 따른 메모리의 크기가 컴파일러마다 달라질 수 있다는 것입니다. 이 때문에 보통 sizeof 연산을 통해 직접 크기를 계산합니다. 하지만 new 연산자를 사용하면 그럴 필요가 없습니다.


2. 소스 코드

new int 연산을 통해서 int 인스턴스 한 개가 동적으로 생성되었습니다.

그리고 그 아래처럼 객체를 동적으로 생성함과 동시에 초기화하는 것도 가능합니다.

 

만약 인스턴스를 배열 형태로 동적 생성했다면 반드시 배열 형태로 삭제를 해야합니다.

즉, int *a = new int[10]; 과 같이 했다면 삭제 할 때도 delete[] a와 같이 해야합니다.


3. malloc과 new의 차이점

 

1) new 연산자는 객체의 생성자를 호출하고, delete 연산자는 객체의 소멸자를 호출합니다.

생성자는 객체를 자동으로 초기화 해주는 함수입니다. 그래서 위에서 보시다시피 초기 값을 줄 수 있습니다. 하지만 malloc의 경우 생성자 호출 기능이 없기 때문에 초기 값을 줄 수가 없습니다.

 

2) 또한 malloc과 free의 경우 라이브러리가 제공하는 함수인데 반해 new와 delete는 연산자라는 점도 있습니다.

 

3) malloc으로 할당한 메모리는 relloc으로 크기를 바꿔 재할당 할 수 있지만 new에는 이러한 기능이 없습니다.

그래서 새로 할당하여 복사하고 원래 메모리를 해체해줘야 합니다.


개념을 명확하게 알아보는 시간을 가졌습니다.

저는 고등학생 때 수학을 참 좋아했었는데요. 수학도 마찬가지로 개념이 잡혀있지 않으면 모든 게 헷갈려지기 마련입니다. 어느 곳에서든 개념만큼 중요한 것은 없는 것 같습니다.

감사합니다.

반응형