[c++] 기타 연산자 오버로딩
[c++] 기타 연산자 오버로딩
c++에는 new와 delete라는 연산자가 있다. 내가 왜 연산자 라는 부분을 강조하냐면 이 new와 delete를 연산자로 인식하지 않는 사람들이 있기 때문에 강조를 해봤다. 또한 연산자 라는 말은 연산자 오버로딩이 가능하단 말이기도 하다. 그리고 new,delete의 연산자 오버로딩은 다른 연산자와 다른 부분들이 있다.
new라는 연산자를 오버로딩 할 때는 실제로 new연산자가 하는 메모리 공간을 할당하는 것과 반환되는 주소 값의 형을 할당하는 자료 형에 맞게 변환시켜주는일, 생성자를 호출하는 일을 전부 오버로딩 하는 것이 아니라. 메모리 공간을 할당하는 일만 하는 것이다. 그렇다면 "나머지 작업은 누가 하지?" 라는 의문이 들 수도 있다. 그에 대한 답변을 하자면 나머지 작업들은 c++ 컴파일러가 해준다. 또한 delete연산자는 메모리 공간의 소멸을 책임지면 된다. new와 delete연산자 오버로딩에 대한 예를 들어보겟다.
void * operator new(size_t size)
{
void * adress = new char[size];
return adress;
}
void operator delete (void *adress)
{
delete []adress;
}
위의 코드는 어떤 클래스 안에서 정의되었다고 생각하고 봐주길 바란다. new 연산자를 오버로딩할때 매개변수가 size_t 라는 것을 발견했을 것이다. 이것을 설명하기 앞서 c++컴파일러는 new연산자가 오버로딩 된 상태에서 오버로딩한 클래스를 대상으로 new 연산자를 사용 하는 문장을 만나게 되면 먼저 할당할 때 필요한 메모리 공간을 계산하고 operator new 함수를 호출해서 계산한 값을 인자로 전달해 주는데 그 값이 size_t 인 것이고 크기정보는 바이트 단위로 전달되기 때문에 크기가 1바이트인 char을 이용하여 메모리 공간을 할당한 다음 반환한 것이다. 그리고 이렇게 할당한 공간의 주소를 반환하면 컴파일러가 생성자를 호출해서 메모리 공간을 대상으로 초기화를 한 후 위에서 말한 것 처럼 주소값을 클래스의 포인터 형으로 형 변환을 해준다.
delete연산자는 말 그대로 데이터 공간의 소멸을 책임을 지고 있다. delete의 매개변수는 delete를 오버로딩한 클래스의 객체가 소멸을 당하게 되면 객체의 소멸자가 호출되고 delete함수의 매개변수로 객체의 주소를 전달하면서 delete함수를 호출합니다. 그렇기 때문에 delete를 오버로딩된 함수는 메모리 공간의 소멸을 책임져야 합니다.