Qaupot Blog
Software Engineering, Trip

205. 생성자와 소멸자

🕐 Sun, 16 Feb 2014 09:00:00 GMT 🕓 Tue, 31 Aug 2021 10:06:00 GMT

생성자와 소멸자

클래스는 생성자(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 를 사용한 방법으로는 할당할 수 있지만, 소멸자와 생성자는 호출되지 않습니다.

이 방법은 주로 특별한 알고리즘 패턴을 통해 생성자나 소멸자를 숨기려고 할 때 사용됩니다.

  • 반드시 특정한 생성 과정을 거쳐야 하거나 소멸 과정을 거쳐야 하는 경우
이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.