델파이 속성(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;
'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 |
댓글