코딩 이야기/델파이 코딩

델파이 Class 설명 및 예제

안개소리 2025. 4. 28. 14:02

Class 설명 및 생성 예제

1. Class란 무엇인가?

델파이에서 클래스(Class)객체(Object)를 생성하기 위한 설계도 또는 템플릿입니다. 객체 지향 프로그래밍(OOP)의 핵심 요소로, 데이터(상태)와 이를 조작하는 로직(행동)을 하나로 묶어 캡슐화합니다.

클래스를 사용하면 다음과 같은 OOP의 주요 특징을 활용할 수 있습니다:

  • 캡슐화 (Encapsulation): 관련된 데이터(필드)와 함수(메소드)를 클래스 안에 묶고, 외부로부터 내부 구현을 숨깁니다. 주로 private, protected, public, published 같은 접근 지정자를 사용하여 정보 은닉을 구현합니다.
  • 상속 (Inheritance): 기존 클래스(부모 클래스 또는 상위 클래스)의 속성과 메소드를 물려받아 새로운 클래스(자식 클래스 또는 하위 클래스)를 만들 수 있습니다. 코드 재사용성을 높이고 계층 구조를 만들 수 있습니다. 델파이의 모든 클래스는 기본적으로 TObject 클래스를 상속받습니다.
  • 다형성 (Polymorphism): 같은 이름의 메소드라도 객체의 타입에 따라 다르게 작동하게 하는 기능입니다. 주로 오버라이딩(Overriding)과 오버로딩(Overloading)을 통해 구현됩니다.

클래스는 다음과 같은 주요 구성 요소를 가집니다:

  • 필드 (Fields): 클래스 내부에 선언된 변수로, 객체의 상태(데이터)를 저장합니다. 보통 private으로 선언하여 외부 접근을 제한합니다. (예: FMyField: Integer;)
  • 메소드 (Methods): 클래스 내부에 정의된 프로시저(Procedure) 또는 함수(Function)로, 객체의 행동(로직)을 정의합니다.
  • 속성 (Properties): 필드에 대한 접근을 제어하는 인터페이스입니다. readwrite 지시자를 통해 필드 값을 읽거나 쓰는 방법을 정의하며, 캡슐화를 강화합니다. (예: property MyValue: Integer read FMyField write SetMyField;)
  • 생성자 (Constructor): 클래스로부터 객체를 생성(인스턴스화)하고 초기화할 때 호출되는 특별한 메소드입니다. 델파이에서는 주로 constructor Create... 형태로 정의됩니다.
  • 소멸자 (Destructor): 객체가 메모리에서 해제되기 전에 호출되는 특별한 메소드입니다. 자원 정리 등의 마무리 작업을 수행합니다. 델파이에서는 주로 destructor Destroy; override; 형태로 정의됩니다.

2. 델파이 Class 생성 예제 (TPerson)

간단한 '사람(Person)'을 나타내는 TPerson 클래스를 정의하고 사용하는 예제입니다.

unit Unit1;

interface

uses
  System.SysUtils, Vcl.Dialogs; // ShowMessage 사용을 위해 추가

type
  TPerson = class(TObject) // TObject를 상속받는 TPerson 클래스 선언
  private
    // 필드 (Fields): 클래스 내부 데이터 저장. 보통 F 접두사 사용
    FName: string;
    FAge: Integer;
    // 속성(Property)의 쓰기(write) 접근자 메소드
    procedure SetAge(Value: Integer);
  public
    // 생성자 (Constructor): 객체 생성 및 초기화
    constructor Create(const AName: string; AAge: Integer);
    // 소멸자 (Destructor): 객체 소멸 전 호출 (TObject의 Destroy를 재정의)
    destructor Destroy; override;

    // 메소드 (Method): 객체의 행동 정의
    procedure Introduce;

    // 속성 (Properties): 필드에 대한 외부 접근 인터페이스 제공
    // Name 속성은 읽기 전용 (read-only)
    property Name: string read FName;
    // Age 속성은 읽기/쓰기 가능 (read-write), 쓰기 시 SetAge 메소드 호출
    property Age: Integer read FAge write SetAge;
  end;

implementation

{ TPerson }

// 생성자 구현
constructor TPerson.Create(const AName: string; AAge: Integer);
begin
  inherited Create; // 상위 클래스(TObject)의 생성자 호출 (필수)
  FName := AName; // 전달받은 이름으로 필드 초기화
  FAge := AAge;   // 전달받은 나이로 필드 초기화
  ShowMessage(Format('TPerson 객체 "%s" 생성됨', [FName]));
end;

// 소멸자 구현
destructor TPerson.Destroy;
begin
  ShowMessage(Format('TPerson 객체 "%s" 소멸됨', [FName]));
  // 필요한 경우 여기서 객체가 사용하던 리소스 해제
  inherited Destroy; // 상위 클래스(TObject)의 소멸자 호출 (필수)
end;

// Introduce 메소드 구현
procedure TPerson.Introduce;
begin
  // 속성을 통해 필드 값에 접근
  ShowMessage(Format('안녕하세요, 제 이름은 %s이고, 나이는 %d살입니다.', [Name, Age]));
end;

// SetAge 메소드 구현 (Age 속성의 write 접근자)
procedure TPerson.SetAge(Value: Integer);
begin
  if Value >= 0 then // 간단한 유효성 검사
  begin
    if FAge <> Value then // 값이 변경될 때만 필드 업데이트
    begin
       ShowMessage(Format('%s의 나이가 %d에서 %d로 변경됨', [FName, FAge, Value]));
       FAge := Value;
    end;
  end
  else
  begin
     ShowMessage('나이는 음수가 될 수 없습니다.');
  end;
end;

// === 클래스 사용 예제 (예: 버튼 클릭 이벤트 핸들러 내부) ===
procedure TForm1.Button1Click(Sender: TObject);
var
  Person1: TPerson; // TPerson 타입의 변수 선언 (객체를 담을 참조 변수)
  Person2: TPerson;
begin
  // 1. 객체 생성 (생성자 호출)
  Person1 := TPerson.Create('홍길동', 30);

  // 2. 객체 사용 (메소드 호출, 속성 접근)
  Person1.Introduce; // 메소드 호출

  Person1.Age := 31; // 속성을 통해 값 변경 (SetAge 메소드 호출됨)
  ShowMessage(Format('홍길동의 현재 나이: %d', [Person1.Age])); // 속성을 통해 값 읽기

  // 또 다른 객체 생성
  Person2 := TPerson.Create('이순신', 45);
  Person2.Introduce;

  // 3. 객체 해제 (메모리 누수 방지를 위해 필수!)
  // Free 메소드는 내부적으로 Destroy 소멸자를 호출합니다.
  // try...finally 블록을 사용하여 예외 발생 시에도 반드시 해제되도록 하는 것이 안전합니다.
  try
    // Person1과 Person2를 사용하는 추가 코드...
  finally
    Person1.Free; // Person1 객체 해제 (Destroy 호출)
    Person2.Free; // Person2 객체 해제 (Destroy 호출)
  end;

  // Free 호출 후에는 해당 변수(Person1, Person2)를 다시 사용하면 안됩니다.
  // Person1 := nil; // 필요하다면 nil을 할당하여 참조를 완전히 제거할 수 있습니다.
end;

end.

3. 정리

클래스는 델파이 프로그래밍에서 매우 중요한 개념입니다. 클래스를 통해 코드를 구조화하고, 재사용성을 높이며, 복잡한 애플리케이션을 더 쉽게 관리할 수 있습니다. 클래스를 정의할 때는 필드, 메소드, 속성, 생성자, 소멸자를 적절히 사용하고, 객체를 생성한 후에는 반드시 Free 메소드를 호출하여 메모리 누수를 방지하는 것이 중요합니다 (try...finally 사용 권장).