이 절에서는 속성(Property)의 정의, 문법, 규격, 직렬화에 대해 학습합니다
Property란 무엇인가
property는 파스칼 문법 설탕입니다. 외부에서는 필드처럼 동작하지만 내부적으로는 getter 읽기 / setter 쓰기를 실제 호출합니다. 비공개 필드 캡슐화, 읽기쓰기 로직 통합, 부가 효과 추가에 사용합니다.
- 읽기쓰기 제어 가능 속성:값 할당/조회 시 추가 로직이 자동 실행됨(화면 다시 그리기, 컴포넌트 동기화, 숫자 유효성 검사);
- 읽기 전용 속성:외부에서 읽기만 가능하고 직접 할당 불가하며 내부 전용 메서드로 데이터를 수정합니다.
program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
uses
SysUtils;
type
TWebPage = class
private
FURL: string;
FColorRGB: Integer;
procedure SetColorRGB(const Value: Integer);
public
property URL: string read FURL;
property ColorRGB: Integer read FColorRGB write SetColorRGB;
procedure Load(const AnURL: string);
procedure PrintStatus;
end;
procedure TWebPage.Load(const AnURL: string);
begin
FURL := AnURL;
Writeln('Load page: ', AnURL);
end;
procedure TWebPage.SetColorRGB(const Value: Integer);
begin
if FColorRGB <> Value then
begin
FColorRGB := Value;
Writeln('Color updated, value = ', Value);
Writeln('Sync component color to ', Value);
end;
end;
procedure TWebPage.PrintStatus;
begin
Writeln('==== Page Info ====');
Writeln('URL(read-only): ', URL);
Writeln('ColorRGB(rw): ', ColorRGB);
Writeln('==================');
Writeln;
end;
var
Page: TWebPage;
begin
Page := TWebPage.Create;
try
Page.Load('https://www.foxdevelop.com/');
Page.ColorRGB := 255;
Page.PrintStatus;
Page.ColorRGB := 255;
Page.PrintStatus;
Page.ColorRGB := 65535;
Page.PrintStatus;
// Page.URL := 'test'; // 컴파일 오류, URL은 읽기 전용
finally
Page.Free;
end;
Readln;
end.Code language: HTML, XML (xml)
TWebPage의 URL 속성은 읽기 전용이므로 수정하려면 Load 프로시저를 사용해야 합니다.
FColorRGB 속성은 읽기가 가능하며 쓰기/수정은 SetColorRGB 프로시저에 의존합니다.
PrintStatus는 일반 프로시저로 TWebPage 내부 정보를 출력하는 용도입니다.

실행 결과
Load page: https://www.foxdevelop.com/
Color updated, value = 255
Sync component color to 255
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================
Color updated, value = 65535
Sync component color to 65535
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 65535
==================Code language: JavaScript (javascript)
2. 속성 3요소 선언 규칙
속성을 선언하려면 읽기 방식은 필수, 쓰기 방식은 선택 지정입니다:
read 읽기 소스 (둘 중 하나 선택)
- 비공개 필드 직접 바인딩 (속도 가장 빠르고 추가 함수 오버헤드 없음)
- 매개변수 없는 getter 함수, 반환 타입이 속성 타입과 완전 일치
write 쓰기 소스 (선택, 생략 시 읽기 전용) 둘 중 하나 선택
- 비공개 필드 직접 바인딩
- 단일 매개변수 setter 함수, 매개변수 타입이 속성과 완전 일치
직렬화 전용 추가 수식자:default, stored
컴파일러는 타입 일치를 강제 검증합니다:
- Integer 속성:getter는 매개변수 없이 Integer 반환 / read에 Integer 비공개 필드 바인딩
- String 속성:setter는 const string 매개변수를 받아야 함
Published 속성과 직렬화
1. 직렬화란 무엇인가
객체 전체 데이터를 스트림(파일/메모리/JSON)에 기록하고 이후 스트림으로부터 객체를 복원하는 기술;
Lazarus 폼 .lfm, 델파이 .dfm 폼 파일은 내부적으로 이 메커니즘에 완전 의존합니다.
- 핵심 전제:속성을
published구간에 선언해야 RTTI 런타임 타입 정보가 인식 가능 - 연계 유틸 유닛:
LResources:lfm 폼 파일 읽기 쓰기FpJsonRtti/CastleComponentSerialize:객체 JSON 직렬화
2. 직렬화 전용 수식자
default <상수>:속성 기본값 표시
- 직렬화 도구 판단용:객체 생성 후 속성 값이 default와 동일하면 직렬화 시 저장을 생략해 파일 크기 축소
- 자동 초기화되지 않음:생성자 내에서 필드에 default 값을 직접 할당해야 함
stored <불린/메서드>:직렬화 시 해당 속성 저장 여부 제어
stored True:기본값, 직렬화 시 파일에 기록stored False:해당 속성을 영원히 저장하지 않음stored IsNeedSave:불린 메서드 호출로 동적 저장 여부 판단
직렬화 예시
type
TWebPage = class
private
FColor: TColor;
function SetColor(const Value: TColor): TColor;
published
// default clBlack은 기본 검은색, 생성자에서 수동 FColor := clBlack 할당 필요
property Color: TColor read FColor write SetColor default clBlack;
// stored False는 lfm/json에 저장되지 않음
property TempCache: string read FTemp write FTemp stored False;
end;
Previous: is와 as 요약