new 연산자
자바에서는 new 연산자를 객체를 생성할 때 주로 사용한다.
c언어에서의 동적할당은 malloc함수를 사용한다
c++ 에서는 new 연산자는 주로 동적 메모리를 할당할 때 주로 사용한다.
사용할 자료의 크기를 미리 알 수 있다면 정적 할당이 편하다.
하지만 얼마나 필요한지 모를 때가 더 많다. 이러한 문제를 해결하기 위해 동적 메모리 할당을 한다.
자료형의 포인터 변수 = new 자료형[배열갯수]; 로 사용한다.
또한 이렇게 동적으로 할당된 메모리는 자동으로 없어지지 않기 때문에 프로그래머가 지워줘야 한다.
지울 때 사용하는 명령어가 delete이며
단일 메모리일 경우 : delete 변수명;
배열 메모리일 경우 : delete [] 변수명; 의 형태로 사용한다.
왜 동적 배열은 delete를 해야하는지는 c/c++이 메모리를 어떻게 사용하는지 알아야한다.
크게 힙과 스택 두 가지 방식으로 메모리를 관리한다.
예를들어 main에서 int 자료형 2개를 사용한다.
int a int b
그리고 함수 func()에서 지역변수로 int 자료형 1개를 더 사용한다.
int a int b int c
함수가 종료되어 지역변수인 int c의 메모리 할당이 취소된다.
int a int b
현재 사용하는 메모리는 8바이트지만 int c는 스택에 그대로 보존된다.
(그래서 레퍼런스 변수로 지역변수를 리턴받아도 값을 출력할 수 있는 것이다.)
하지만 힙은 순차적으로 관리되는 영역이 아니라 값이 사용중인지 아닌지 알 수가 없다.
그래서 사용자가 지워주지 않으면 int c는 프로그램이 종료될 때 까지 계속 남아있게 된다.
이러한 이유로 delete를 해주는 것이다. 그렇지 않으면 메모리 누수가 일어나고 컴퓨터가 점점 느려질 것이다.
또 new, delete 연산자는 클래스를 동적할당/해제 하면서 생성자/소멸자를 호출해준다.
클래스 내에서 동적할당을 할 경우에는 멤버변수로 포인터 변수를 만들고, 꼭 생성자가 아니더라도 멤버함수나 어디서든 원하는 때에 동적할당을 하고나서 소멸자에서 해제해주면 된다.
댓글