클래스 생성자와 소멸자

클래스 생성자와 소멸자

클래스 생성자나 소멸자도 만들 수 있어요. 클래스를 사용하기 전에 초기화해야 하는 클래스 변수나 클래스 프로퍼티를 준비해 두는 역할을 해요.

출처: Class constructors and destructors

본문

클래스 생성자와 소멸자는 프로그램 시작 시 자동으로 호출돼요. 생성자는 선언된 유닛의 초기화(initialization) 섹션보다 먼저 호출되고, 소멸자는 그 유닛의 종료(finalisation) 섹션 이후에 호출돼요.

클래스 생성자/소멸자를 쓸 때는 몇 가지 주의할 점이 있어요.

  • 클래스마다 생성자는 하나만 허용돼요. 이름은 아무거나 쓸 수 있지만 매개변수를 가질 수 없어요.
  • 클래스마다 소멸자도 하나만 허용돼요. 이름은 자유지만 매개변수를 가질 수 없어요.
  • 생성자와 소멸자 모두 가상(virtual)일 수 없어요.
  • 클래스 생성자/소멸자는 클래스의 사용 여부와 관계없이 호출돼요. 클래스를 한 번도 쓰지 않아도 생성자와 소멸자는 호출돼요.
  • 클래스 생성자/소멸자 간 호출 순서는 보장되지 않아요.
  • 중첩 클래스의 경우, 내포 클래스의 생성자는 바깥 클래스의 생성자 이후에 호출되고, 소멸자는 반대 순서로 호출되는 것만 보장돼요.

다음 프로그램을 볼게요.


{$mode objfpc}
 
{$h+}
 

 
Type
 
  TA = Class(TObject)
 
  Private
 
    Function GetA : Integer;
 
    Procedure SetA(AValue : integer);
 

 
  public
 
    Class Constructor create;
 
    Class Destructor destroy;
 
    Property A : Integer Read GetA Write SetA;
 
  end;
 

 
{Class} Function TA.GetA : Integer;
 

 
begin
 
  Result:=-1;
 
end;
 

 
{Class} Procedure TA.SetA(AValue : integer);
 

 
begin
 
  //
 
end;
 

 
Class Constructor TA.Create;
 

 
begin
 
  Writeln('Class constructor TA');
 
end;
 

 
Class Destructor TA.Destroy;
 

 
begin
 
  Writeln('Class destructor TA');
 

 
end;
 

 
Var
 
  A : TA;
 

 
begin
 
end.

실행하면 다음이 출력돼요.

Class constructor TA
 
Class destructor TA

클래스 생성자와 소멸자는 클래스가 실제로 인스턴스화되지 않아도 자동으로 호출되므로, 클래스 단위 전역 초기화가 필요한 경우에 자연스럽게 맞는 도구예요.

더 알아보기

  • 클래스 메서드(Class methods)
  • 정적 클래스 메서드(Static class methods)