정적 클래스 메서드
정적 클래스 메서드
FPC는 클래스 안에서 정적 클래스 메서드(static class method)를 지원해요. 끝에 Static 키워드를 붙인 클래스 메서드예요.
본문
정적 클래스 메서드는 완전히 일반 프로시저나 함수처럼 동작해요. 그 말은 곧 이런 특징을 뜻해요.
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)