클래스 생성자와 소멸자
클래스 생성자와 소멸자
클래스 생성자나 소멸자도 만들 수 있어요. 클래스를 사용하기 전에 초기화해야 하는 클래스 변수나 클래스 프로퍼티를 준비해 두는 역할을 해요.
본문
클래스 생성자와 소멸자는 프로그램 시작 시 자동으로 호출돼요. 생성자는 선언된 유닛의 초기화(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)