정적 클래스 메서드

정적 클래스 메서드

FPC는 클래스 안에서 정적 클래스 메서드(static class method)를 지원해요. 끝에 Static 키워드를 붙인 클래스 메서드예요.

출처: Static class methods

본문

정적 클래스 메서드는 완전히 일반 프로시저나 함수처럼 동작해요. 그 말은 곧 이런 특징을 뜻해요.

  • Self 매개변수가 없어요. 그 결과 프로퍼티나 필드, 일반 메서드에 접근할 수 없어요.
  • 가상(virtual)일 수 없어요.
  • 일반 프로시저 변수에 할당할 수 있어요.

주된 용도는 프로시저를 유닛의 네임스페이스가 아닌 클래스의 네임스페이스에 포함시키는 거예요. 이때도 모든 클래스 변수나 타입에는 접근할 수 있으니, 다음처럼 쓰는 게 가능해요.


 {$mode objfpc}
 
{$h+}
 

 
Type
 
  TA = Class(TObject)
 
  Private
 
    class var myprivatea : integer;
 
  public
 
    class Function GetA : Integer;  static;
 
    class Procedure SetA(AValue : Integer); static;
 
  end;
 

 
Class Function TA.GetA : Integer;
 

 
begin
 
  Result:=myprivateA;
 
end;
 

 
Class Procedure TA.SetA(AValue : integer);
 

 
begin
 
  myprivateA:=AValue;
 
end;
 

 
 

 
begin
 
  TA.SetA(123);
 
  Writeln(TA.MyPrivateA);
 
end.

실행하면 123이 출력돼요.

정적 클래스 메서드의 구현 안에서는 Self 식별자를 쓸 수 없어요. 메서드는 Self가 선언된 클래스(하드코딩)로 고정된 것처럼 동작하지, 호출에 사용된 실제 클래스를 기준으로 동작하지 않아요. 반면 일반 클래스 메서드에서 Self는 메서드가 호출된 실제 클래스를 담아요. 다음 예시가 이를 분명하게 보여줘요.


Type
 
  TA = Class
 
    Class procedure DoIt; virtual;
 
    Class Procedure DoitStatic; static;
 
  end;
 

 
  TB = CLass(TA)
 
    Class procedure DoIt; override;
 
  end;
 

 
 

 
Class procedure TA.DOit;
 

 
begin
 
  Writeln('TA.Doit : ',Self.ClassName);
 
end;
 

 
Class procedure TA.DOitStatic;
 

 
begin
 
  Doit;
 
  Writeln('TA.DoitStatic : ',ClassName);
 
end;
 

 
Class procedure TB.DoIt;
 

 
begin
 
  Inherited;
 
  Writeln('TB.Doit : ',Self.ClassName);
 
end;
 

 
begin
 
  Writeln('Through static method:');
 
  TB.DoItStatic;
 
  Writeln('Through class method:');
 
  TB.Doit;
 
end.

실행하면 다음이 출력돼요.

Through static method:
 
TA.Doit : TA
 
TA.DoitStatic : TA
 
Through class method:
 
TA.Doit : TB
 
TB.Doit : TB

정적 클래스 메서드를 TB로 호출했어도, 그 안에서 클래스(만약 Self가 있었다면)는 정적 메서드가 정의된 클래스인 TA로 고정돼요. 반면 일반 클래스 메서드는 실제로 호출에 사용된 클래스인 TB를 기준으로 동작해요.

더 알아보기

  • 클래스 메서드(Class methods)
  • 메시지 메서드(Message methods)