생성자와 소멸자

생성자와 소멸자 (Constructors and Destructors)

객체 선언의 문법 다이어그램에서 보듯이, Free Pascal은 생성자(constructor)와 소멸자(destructor)를 지원해요. 다만 객체를 사용할 때 생성자와 소멸자를 직접 호출하는 것은 프로그래머의 책임이라는 점을 기억해야 합니다.

출처: Constructors and destructors

본문

생성자/소멸자 쌍은 객체가 **가상 메서드(virtual methods)**를 사용한다면 필수예요. 이유는 가상 메서드를 가진 객체는 내부적인 준비 작업(housekeeping)이 필요한데, 이 작업을 생성자가 담당하기 때문이에요. (VMT에 대한 포인터를 설정해야 하죠.)

객체 타입의 선언에서는 생성자나 소멸자의 이름에 단순 식별자를 사용해야 해요. 구현할 때는 정규화된 메서드 식별자, 즉 objectidentifier.methodidentifier 형태를 사용합니다.

Free Pascal은 NewDispose 프로시저의 확장 구문도 지원해요. 객체 타입의 동적 변수를 할당해야 할 때, New 호출에 생성자 이름을 지정할 수 있거든요. New는 인스턴스화된 객체에 대한 포인터를 돌려주는 함수로 구현되어요. 다음 선언을 볼게요.

Type
  TObj = object;
   Constructor init;
   ...
   end;

  Pobj = ^TObj;

Var PP : Pobj;

그러면 아래 세 호출은 서로 동등해요.

pp := new (Pobj,Init);
new(pp,init);
new (pp);
  pp^.init;

마지막 경우 컴파일러는 객체 인스턴스를 만들려면 new·dispose의 확장 구문을 써야 한다는 경고를 냅니다. 이 경고를 무시할 수도 있지만, 객체 인스턴스를 만들 때는 확장 구문을 쓰는 게 좋은 프로그래밍 습관이에요. 마찬가지로 Dispose 프로시저도 소멸자 이름을 인자로 받을 수 있어요. 그렇게 하면 객체를 힙에서 제거하기 전에 소멸자가 호출됩니다.

컴파일러 경고 얘기가 나온 김에 말씀드리면, 다음 장에서 다루는 Delphi 방식의 객체 지향 프로그래밍이 좀 더 자연스러운 객체 지향 방식이라고 볼 수 있어요.

  1. VMT에 대한 포인터를 설정해야 합니다.

더 알아보기