클래스 프로퍼티(Class Properties)
클래스 프로퍼티(Class Properties)
보통 프로퍼티는 객체 인스턴스마다 값이 달라져요. 그런데 프로퍼티 자체를 클래스에 묶어 두고 싶을 때가 있어요. 그럴 때 쓰는 게 클래스 프로퍼티(class property)예요. 값의 저장 공간도, 접근에 쓰는 메서드도 클래스 수준에서 관리된다는 점을 알아두면 헷갈리지 않아요.
출처: Class properties
본문
클래스 프로퍼티는 전역 프로퍼티 정의와 아주 비슷해요. 차이는 프로퍼티가 클래스의 인스턴스가 아니라 클래스 자체와 연결된다는 점이에요. 그 덕분에 한 가지가 따라오는데, 프로퍼티 값을 저장할 공간은 일반 필드나 변수가 아니라 반드시 class var(클래스 변수)여야 해요. 일반 필드나 변수는 인스턴스에 저장되니까요.
클래스 프로퍼티도 일반 프로퍼티처럼 getter와 setter 메서드를 가질 수 있지만, 이 메서드들은 반드시 클래스의 정적 메서드여야 해요. 아래 코드가 바로 유효한 클래스 프로퍼티 정의예요.
TA = Class(TObject)
Private
class var myprivatea : integer;
class Function GetB : Integer; static;
class Procedure SetA(AValue : Integer); static;
class Procedure SetB(AValue : Integer); static;
public
Class property MyA : Integer Read MyPrivateA Write SetA;
Class property MyA : Integer Read GetB Write SetB;
end;
왜 정적 메서드여야 할까요? 그 이유는 클래스 프로퍼티가 그 프로퍼티가 정의된 특정 클래스에 묶이기 때문이에요. 파생 클래스와는 연결되지 않아요. 그런데 클래스 메서드는 가상으로 선언될 수 있기 때문에, getter/setter가 가상이라면 파생 클래스가 그 메서드를 오버라이드할 수 있게 돼요. 그러면 클래스 프로퍼티 접근에 쓸 수 없게 되죠. 그래서 정적 메서드만 허용하는 거예요.
더 알아보기
- class var 클래스 변수의 개념과 범위 규칙은 6.3 절(클래스)에서 다뤄요.
- 프로퍼티의 일반적인 정의와 다양한 형태는 6.7 절(프로퍼티)을 참고해요.
- 정적 메서드의 의미는 6.6.6 절(정적 클래스 메서드)에서 확인할 수 있어요.