프로퍼티 정의
프로퍼티 정의
클래스는 필드 목록의 일부로 프로퍼티(property)를 가질 수 있어요. 프로퍼티는 일반 필드처럼 동작해서 값을 읽거나 쓸 수 있지만, 필드 접근을 함수와 프로시저를 통해 우회(redirect)할 수 있게 해요.
출처: Definition
본문
프로퍼티는 클래스 "필드"에 값을 할당하거나 읽을 때 작업(action)을 연결하는 수단이에요. 덕분에 값을 할당할 때 그 값이 유효한지 검사하거나, 읽을 때 값을 즉석에서 구성할 수 있어요. 게다가 프로퍼티는 읽기 전용이나 쓰기 전용으로 만들 수도 있어요.
read 지정자는 프로퍼티를 담고 있는 필드의 이름이거나, 프로퍼티 타입과 같은 반환 타입을 가진 메서드 함수의 이름이에요. 단순 타입의 경우 이 함수는 인자를 받으면 안 돼요. 배열 프로퍼티라면 인덱스와 같은 타입의 인자 하나를 받아야 하고, 인덱스 프로퍼티라면 정수형 인자를 받아야 해요.
read 지정자는 생략할 수 있어요. 생략하면 프로퍼티는 쓰기 전용이 돼요. 클래스 메서드는 read 지정자로 사용할 수 없다는 점을 주의해요.
write 지정자는 선택 사항이에요. write 지정자가 없으면 프로퍼티는 읽기 전용이 돼요. write 지정자는 필드의 이름이거나, 프로퍼티와 같은 타입의 변수를 단일 인자로 받는 메서드 프로시저의 이름이에요. 배열 프로퍼티라면 인자 두 개를 받아야 하는데, 첫 인자는 인덱스와 같은 타입, 두 번째 인자는 프로퍼티와 같은 타입이어야 해요. 마찬가지로 인덱스 프로퍼티라면 첫 매개변수가 정수여야 해요.
지정된 함수나 프로시저가 놓여 있는 섹션(private, published)은 중요하지 않아요. 다만 보통은 protected나 private 메서드일 거예요.
예를 들어 다음 선언을 볼게요.
Type
MyClass = Class
Private
Field1 : Longint;
Field2 : Longint;
Field3 : Longint;
Procedure Sety (value : Longint);
Function Gety : Longint;
Function Getz : Longint;
Public
Property X : Longint Read Field1 write Field2;
Property Y : Longint Read GetY Write Sety;
Property Z : Longint Read GetZ;
end;
Var
MyClass : TMyClass;
다음은 유효한 문장이에요.
WriteLn ('X : ',MyClass.X);
WriteLn ('Y : ',MyClass.Y);
WriteLn ('Z : ',MyClass.Z);
MyClass.X := 0;
MyClass.Y := 0;
하지만 다음은 오류를 발생시켜요.
MyClass.Z := 0;
그 이유는 Z가 읽기 전용 프로퍼티이기 때문이에요.
위 문장들에서 일어나는 일은 이래요. 값을 읽어야 할 때 컴파일러는 객체의 각 getNNN 메서드 호출을 삽입하고 그 호출의 결과를 사용해요. 할당할 때는 컴파일러가 할당할 값을 매개변수로 각 setNNN 메서드에 전달해요.
이 메커니즘 때문에 프로퍼티는 함수나 프로시저에 var 인자로 전달할 수 없어요. 프로퍼티의 주소가 (항상 그런 건 아니지만) 알 수 없기 때문이에요.
더 알아보기
- 인덱스 프로퍼티(Indexed properties)
- 배열 프로퍼티(Array properties)