생성자와 소멸자
클래스는 생성자(Constructor)와 소멸자(Destructor) 같은 생명 주기를 관리하는 특별한 멤버 함수
들을 가질 수 있습니다.
생성자 (Constructor)
생성자는 클래스가 인스턴스화 될때 호출되며, 클래스의 이름과 동일한, 반환형이 없는 함수입니다.
class Number
{
private :
int number;
public :
Number(int num)
{
number = num;
}
int getNumber()
{
return number;
}
};
int main(int argc,char** argv)
{
Number num(20);
printf("%d\n",num.getNumber());
return 0;
}
num 은 main 함수의 Number 자료형 지역변수입니다.
이 지역변수가 인스턴스화 되는 시점에서 Number(int num) 함수가 호출됩니다.
생성자에 인수가 있을 경우, 변수 명 뒤에 ()를 붙이고 그 안에 인수를 기입합니다.
인수가 하나인 생성자는 다른 자료형으로부터 생성한다는 의미에서 변환 생성자(Conversion constructor)라고 불리기도 합니다.
int main(int argc,char** argv)
{
Number* num = new Number(20);
printf("%d\n",num.getNumber());
return 0;
}
new 키워드를 사용할때는 자료형 뒤에 ()를 붙이고 그 안에 인수를 기입합니다.
new 를 통해 인스턴스화 되는 시점에 생성자가 호출됩니다.
소멸자(Destructor)
소멸자는 인스턴스가 소멸 될때 호출됩니다.
소멸자 역시 반환형은 없으며, 클래스의 이름앞에 ~을 붙인 함수가 소멸자가 되고, 인수를 가질 수 없습니다.
#include <iostream>
class Number
{
public:
~Number()
{
printf("Call destructor\n");
}
};
int main(int argc, char** argv)
{
printf("Start Main Func\n");
Number num;
printf("End of Main Func\n");
return 0;
}
지역 변수는 함수가 소멸 될때 같이 소멸합니다.
따라서 "End of Main Func"라는 출력문보다 늦게 소멸자가 호출 되었음을 확인할 수 있습니다.
int main(int argc, char** argv)
{
printf("Start Main Func\n");
Number* num = new Number;
delete num;
printf("End of Main Func\n");
return 0;
}
new / delete 키워드를 사용할때는 delete 되는 시점이 소멸 시점입니다. 이 작업은 main 함수 내에서 이루어졌으며, 소멸자의 출력문은 위와 같습니다.
int main(int argc, char** argv)
{
printf("Start Main Func\n");
Number* num = new Number;
printf("End of Main Func\n");
return 0;
}
만약 delete 를 사용하여 인스턴스를 해제하지 않는다면 영원히 소멸자는 호출되지 않습니다.
이 경우, 메모리가 누수될 수도 있고 OS에 의해 메모리가 강제 수거 되더라도 소멸자는 호출되지 않습니다.
생성자와 소멸자의 접근 권한
생성자와 소멸자 역시 멤버 함수이기 때문에 private, protected, public 접근 권한을 지정할 수 있습니다.
생성자나 소멸자 둘 중 하나라도 private 나 protected 로 지정되면
일반적인 방법으로는 지역 변수 혹은 전역 변수로써 선언할 수 없습니다.
동적 할당일 경우,
- 생성자가 private 일 경우 new 키워드를 이용해 선언할 수 없으며
- 소멸자가 private 일 경우 delete 키워드를 이용해 삭제할 수 없습니다.
단, malloc 과 free 를 사용한 방법으로는 할당할 수 있지만, 소멸자와 생성자는 호출되지 않습니다.
이 방법은 주로 특별한 알고리즘 패턴을 통해 생성자나 소멸자를 숨기려고 할 때 사용됩니다.
- 반드시 특정한 생성 과정을 거쳐야 하거나 소멸 과정을 거쳐야 하는 경우