클래스 메서드

클래스 메서드

클래스 메서드는 인스턴스 없이도 호출할 수 있는 메서드예요. 보통 인스턴스에 묶여서 동작하는 일반 메서드와 달리, 클래스 자체에 속한 정보를 다루고 싶을 때 사용해요.

출처: Class methods

본문

클래스 메서드는 프로시저나 함수 선언 앞에 Class 키워드를 붙여서 구분해요. 다음 예시를 볼게요.

  Class Function ClassName : String;

클래스 메서드는 인스턴스를 갖지 않는 메서드예요. 즉 Self가 클래스 인스턴스를 가리키지 않지만, 클래스의 스코프 규칙과 상속 규칙은 그대로 따라요. 현재 클래스에 대한 정보를 돌려주는 용도로 쓸 수 있는데, 예를 들어 등록(registration)이나 클래스 팩토리에서 활용해요. 인스턴스가 없으니 인스턴스에 저장된 정보는 사용할 수 없어요.

클래스 메서드는 일반 메서드 안에서 호출할 수 있고, 클래스 식별자를 통해서도 호출할 수 있어요.

Var
 
  AClass : TClass; // AClass is of type "type of class"
 

 
begin
 
  ..
 
  if CompareText(AClass.ClassName,'TCOMPONENT')=0 then
 
  ...

인스턴스로부터 호출하는 것도 가능해요.

Var
 
  MyClass : TObject;
 

 
begin
 
  ..
 
  if MyClass.ClassNameis('TCOMPONENT') then
 
  ...

반대로 인스턴스에서 클래스 메서드로 접근하는 방식과 달리, 클래스 메서드 안에서는 일반 인스턴스 요소를 쓸 수 없어요. 클래스 메서드 안에서 Self 식별자는 클래스의 VMT 테이블을 가리켜요. 필드나 프로퍼티, 일반 메서드는 클래스 메서드 안에서 사용할 수 없고, 일반 프로퍼티나 메서드에 접근하면 컴파일 오류가 나요.

클래스 메서드는 가상(virtual)일 수 있고 오버라이드할 수도 있어요.

또한 클래스 메서드는 일반 프로퍼티의 읽기(read) 또는 쓰기(write) 지정자로 쓸 수 있어요. 다만 클래스 메서드에는 인스턴스가 없으니, 그 프로퍼티는 클래스의 모든 인스턴스에 대해 같은 값을 갖게 돼요.

더 알아보기

  • 정적 클래스 메서드(Static class methods)
  • 클래스 생성자와 소멸자(Class constructors and destructors)