속성(Property)

이 절에서는 속성(Property)의 정의, 문법, 규격, 직렬화에 대해 학습합니다

Property란 무엇인가

property는 파스칼 문법 설탕입니다. 외부에서는 필드처럼 동작하지만 내부적으로는 getter 읽기 / setter 쓰기를 실제 호출합니다. 비공개 필드 캡슐화, 읽기쓰기 로직 통합, 부가 효과 추가에 사용합니다.

  1. 읽기쓰기 제어 가능 속성:값 할당/조회 시 추가 로직이 자동 실행됨(화면 다시 그리기, 컴포넌트 동기화, 숫자 유효성 검사);
  2. 읽기 전용 속성:외부에서 읽기만 가능하고 직접 할당 불가하며 내부 전용 메서드로 데이터를 수정합니다.
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:

답글 남기기

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