코딩 이야기/델파이 코딩
델파이 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): 필드에 대한 접근을 제어하는 인터페이스입니다.
read
및write
지시자를 통해 필드 값을 읽거나 쓰는 방법을 정의하며, 캡슐화를 강화합니다. (예: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
사용 권장).