본문 바로가기
Delphi/문법

델파이 속성(Property) 이해하기 객체 지향 프로그래밍에서의 활용과 장점

by MonoSoft 2023. 6. 1.
728x90
반응형

델파이 속성(Property) 이해하기  객체 지향 프로그래밍에서의 활용과 장점

 

 

 

델파이(Delphi)는 Object Pascal을 기반으로

한 강력한 프로그래밍 언어로, 객체 지향 프로그래밍(OOP)을 지원하는

대표적인 언어 중 하나입니다.

OOP는 코드의 재사용성, 유지 보수성 및 가독성을 향상시키기 위한

강력한 개념을 제공합니다.

 

이 중 하나인 속성(Property)은 객체 지향 프로그래밍에서 중요한 개념으로,

이번 포스팅에서는 델파이의 속성에 대해 자세히 알아보겠습니다.

 

속성(property)

 

한 클래스에서 속성(property)은 그 클래스의 정적인 특성을 나타냅니다.

사람을 예로 든다면 이름, 키, 몸무게, 성별, 생년월일 등과 같은 것이

사람 을 나타내는 속성이 될 수 있습니다.

 

이 속성은 한 클래스를 다른 클래스와 구별하는 가장 기본적인 특성입니다.

우리가 이름이라는 속성으로 사람을 구별하듯이 클래스도

이 속성이 그 클 래스의 특징을 대표한다고 할 수 있습니다.

따라서 속성은 클래스에서 가장 중요한 요소라 할 수 있을 것입니다.

 

델파이에서 속성은 위와같은 중요성 외에 ,

이 속성을 설계 시간에 이용할 수 있다는 점에서 특히 중요합니다.

 

즉. 속성은 object inspector에 나타나기 때문에 ,

이 속성을 이용해서 해당 클래스(컴퍼넌트)의 외형이나

동작하는 방식을 설계 시간에 설정할 수 있습니다.

그래서 속성은 비주얼 프로그래밍 의 가장 중요한 요소입니다.

 

컴퍼넌트의 크기 , 폰트 , 위치 등을 설계 시간에 설정할 수 있으므로 ,

우리는 컴퍼넌트를 시각적으로 설계할 수 있는 것입니다.

그렇지 않다면 코드 상에서 설정해야 하는 번거로움이 우리를 괴롭힐 것입니다.

 

그러므로 클래스를 사용하는 입장이나 클래스를 만드는 입장

모두 속성은 일차적으로 생각해야 할 문제입니다.

클래스를 설계할 때 , 속성을 잘 만들 면 그 클래스를 이용하는

어플리케이션에서 손쉽게 프로그램을 개발할 수 있습니다.

 

그러면 이제부터 속성을 어떻게 정의하고,

어떻게 사용하는지에 대해 자세히 알아보도록 하겠습니다.

 

속성을 선언하는 일반적인 구문은 다음과 같습니다.

property PropName : PropType read GetMethod write SetMethod;

먼저 속성은 선언하기 위해서는 property라는 예약어를 사용합니다.

 

다음에는 속성의 이름이 나옵니다.

속성의 이름은 그 속성의 의미를 알 수 있도록 명명하면 됩니다.

즉 몸무게라는 속성은 weight로 이름은 name과 같이 붙이는 것이

그 속성의 역할을 쉽게 알 수 있다는 것입니다.

 

 

그리고 그 다음에는 그 속성의 타입(type)이 나타납니다.

integer , string , TBitmap등 파일 타입을 제외한

어떠한 타입이라도 될 수 있습니다.

 

그 다음에는 read라는 지시어가 나타나는데,

이 read 지시어는 속성값을 읽 기 위해서 사용하는 메서드를 나타냅니다.

일반적으로 read 메서드는 리턴 값이 속성의 타입과 동일한 함수(function)를 사용합니다.

 

마지막으로 write 지시어는 속성에 값을 할당하기 위해

사용하는 메서드를 나타냅니다.

이 메서드는 한 개의 인수를 가진 프로시저(procedure)를 사용 합니다.

물론 이 인수는 속성의 타입과 동일해야 하겠죠!

 

위에서 속성을 선언할 때 , read과 write를 전부 사용해야 하는 것은 아니며

또한 read, write 메서드로 반드시 프로시저나 함수를 사용해야 한다는 것도 아닙니다.

앞으로 write 지시어만 사용한 경우나 ,

프로시저나 함수가 아닌 필드(field)를 사용하는 경우도 보게 될 것입니다.

 

다음에 속성을 선언하는 몇몇 예를 나열해 놓았으니 참고하십시오.

property Left: Integer read FLeft write SetLeft;
property Top: Integer read FTop write SetTop;
property Width: Integer read FWidth write SetWidth;
property Height: Integer read FHeight write SetHeight;
property Hint: string read GetHint write SetHint;

 

 

속성과 필드(field)

우리는 속성에서 값을 읽어 오거나 속성에 새로운 값을 설정할 수 있습 니다.

그러면 속성에 설정된 값은 어디에 기억됩니까?

속성 그 자체는 값을 저장 할 능력이

없습니다. 속성은 필드라는 데이터에 해당 속성값을 보관합니다.

 

아래의 예 를 보도록 합시다.

TSample=class
private
FName:String;
FHeight:Integer;
FBirth:TDateTime;
function GetBirth:TDateTime;
procedure SetBirth(Date:TDateTime); public

property Name:String read FName write FName; property Height:Integer read FHeight write FHeight;
property Birth:TDateTime read GetBirth write SetBirth; end;

 

위의 TSample 클래스에서 Name, Height, Birth라는

속성의 값은 각각 FName, FHeight, FBirth 라는 필드(데이터)에 저장됩니다.

위의 예에서 Name과 Height 속성은 바로 필드에서 값을 읽어오고,

필드에 바로 속성값 을 설정합니다.

그리고 SetBirth라는 프로시저도

결국 FBirth의 값을 설정하 는 프로시저입니다.

 

이와같이 필드는 속성의 값을 저장하는 데에 사용하는 변수입니다.

속성의 이 필드를 참조로 해서 속성의 값을 읽어 오거나 설정하게 됩니다.

 

그렇다고 모든 속성이 반드시 새로운 필드를 요구하는 것은 아닙니다.

위의 클래스에서 새로운 속성 Age(나이)를 생각해 보겠습니다.

나이는 올해와 태 어난 연도(Birth 속성)를 알면되므로 ,

Age 속성은 Birth 속성값을 이용해 계산할 수 있습니다.

따라서 나이 속성은 따로 속성값을 저장할 필드를 가 질 필요가 없고,

FBirth의 값을 이용하면 됩니다.

그래서 Age 속성에 대한 선언은 아래와 같은 형식이 될 것입니다.

 

property Age:Integer read GetAge;

 

함수 GetAge는 FBirth와 올해년도를 이용해서

나이를 계산할 수 있으므로

FAge와 같이 별도의 필드를 이용해야 할 필요가 없습니다.

한가지 주목할 점은 Age 속성의 경우 write 메서드가 없다는 것입니다.

 

나이는 마음대로 설정할 수 있는 것이 아니고,

태어난 해와 지금의 연도를 알면 정해지는 것 이므로 ,

이 속성은 읽기전용 속성이 됩니다.

 

필드는 "F"로 시작하는 관례이며,

"F"다음에는 속성의 이름이 오는 것이 일 반적인 관례입니다.

만약에 Text라는 속성이 있다면 ,

이 속성의 필드는 FText로 명명하는 것이 일반적입니다.

 

필드는 클래스 내부에서만 사용하고, 클래스 외부에서는

이 필드에 접근해 야 할 이유가 없기 때문에 필드는 private에 선언하는 것이 대부분입니다.

 

 

접근 메소드

앞에서 속성의 값을 읽을 때 read 메서드를 이용하며,

값을 설정할 때 는 write 메서드를 이용한다고 말했습니다.

 

다음과 같은 문

S:= Label1.Caption;

와 같은 문은

S라는 변수에 Label1의 속성값을 읽어오기 때문에,

위와 같은 경우에는

TLabel 클래스의 Caption 속성에서 read 메서드를 호출합니다.

 

read 메서드는 그 리턴값이 속성의 형과 같기 때문에

변수 S에 Caption의 값이 저장됩니다.

 

반대로 속성의 값을 설정하는 다음과 같은 문

Label1.Caption:='테스트';

 Label1의 Caption 속성의 값을 설정하는 문이기 때문에

Caption 속성의 write 메서드를 호출하며,

write 메서드는 Caption 속성을 '테스트'로 설정합 니다.

 

read나 write 메서드는 직접 필드를 이용해 속성값을 읽거나 쓸 수 있으며,

함수( read 메서드)나 프로시저(write 메서드)를 이용할 수도 있습니다.

 

 

Read 메서드

read 메서드는 속성으로부터 값을 읽을 때 사용하는 메서드입니다.

따라 서 read 메서드는 프로시저가 아닌 함수가 되어야 하며, 그 리턴값도 속성 과 같은 타입이 되어야 합니다. 그리고 read

 

메서드는 보통 인수없이 사용 합니다.

위의 TSample 클래스를 아래와 같이 수정해 보도록 하겠습니다.

 

TSample=class
private
FName:String;
FHeight:Integer;
FBirth:TDateTime;
function GetBirth:TDateTime;
function GetName:String;
procedure SetName(Value:String); procedure SetBirth(Date:TDateTime); function GetAge:Integer;
public
property Name:String read GetName write SetName;
property Height:Integer read FHeight write FHeight;
property Birth:TDateTime read GetBirth write SetBirth; property Age:Integer read GetAge; end;

 

728x90
반응형

'Delphi > 문법' 카테고리의 다른 글

델파이 포인터 (Pointer) 1편  (0) 2023.08.03
런타임시에 컴퍼넌트 이동,크기조절  (0) 2023.06.13
열거형의 사용방법  (0) 2021.10.08
델파이 shl 과 shr 설명  (0) 2021.06.18
제네릭 - 델파이 TDictionary 사용  (0) 2021.06.17

댓글