생성자와 소멸자

클래스, 클래스 인스턴스, 생성자, 소멸자

위 예시에는 TAnimal과 하위 클래스 TDog가 포함됩니다. 클래스는 단순한 타입으로 템플릿이라고 이해할 수 있습니다. 클래스 자체는 어떤 데이터도 저장하지 않으며 예시의 필드 MyInt: Integer에는 메모리가 할당되지 않습니다.

클래스 변수를 통해 클래스 자체에 데이터를 담을 수 있지만 여기서는 다루지 않고 일반 필드를 가진 기본 클래스만 설명합니다.

필드에 메모리를 할당하려면 클래스 인스턴스를 생성해야 하며, 인스턴스 생성 시 생성자를 호출합니다.

인스턴스를 생성하지 않으면 클래스 코드는 없는 것과 마찬가지로 실행되지 않고 변수에 메모리도 할당되지 않습니다. 클래스를 틀에 비유할 수 있는데 사용할 때만 메모리가 할당되고 사용하지 않을 때는 리소스를 소모하지 않은 채 그대로 유지됩니다.

생성자

  • 키워드 constructor로 선언하는 특수 메서드;
  • 시스템이 먼저 객체 메모리를 할당한 뒤 생성자 코드를 실행;
  • 모든 클래스는 암시적으로 TObject를 상속하며 매개변수 없는 기본 생성자 Create가 내장되어 별도 작성 없이 사용 가능;
  • 사용자 정의 생성자는 객체 초기화에 가장 적합하며 필드에 초기값을 할당할 수 있음;
  • 사용자 정의 생성자는 관례상 Create로 명명합니다.

예시 코드

program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;

type
  TAnimal = class
  private
    InternalStuff: TObject;
  public
    constructor Create;
    destructor Destroy; override;
  end;

constructor TAnimal.Create;
begin
  inherited Create; // 맨 앞에서 부모 클래스 생성자 호출
  InternalStuff := TObject.Create;
  Writeln('TAnimal.Create 생성자 실행');
end;

destructor TAnimal.Destroy;
begin
  Writeln('TAnimal.Destroy 소멸자 실행');
  FreeAndNil(InternalStuff); // 내부 하위 객체 해제
  inherited Destroy; // 마지막에 부모 클래스 소멸자 호출
end;

var
  C: TAnimal;
begin
  C := TAnimal.Create;
  try
    // 객체 사용
  finally
    FreeAndNil(C); // Destroy 소멸자 자동 호출
  end;
end.

실행 결과

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
38 lines compiled, 0.1 sec, 68672 bytes code, 4260 bytes data

D:\fpcdemo>mydemo
TMyClass.Create 생성자 실행
TMyClass.Destroy 소멸자 실행Code language: CSS (css)

InternalStuff는 클래스 내부에서 보관하는 하위 객체입니다. 생성자에서 생성하고 소멸자 내에서 FreeAndNil로 해제해야 메모리 누수를 방지할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다