클래스 필드/변수
클래스 필드/변수 (Class fields/variables)
객체와 비슷하게, 클래스는 정적 필드 또는 클래스 변수를 담을 수 있어요. 이 필드나 변수는 클래스에 전역이고, 전역 변수처럼 동작하지만 클래스의 일부로만 알려져 있어요. 클래스의 메서드 안에서 참조할 수 있고, 클래스 밖에서도 정규화된 이름으로 참조할 수 있어요.
본문
클래스 변수를 정의하는 방법도 두 가지예요. 첫 번째는 객체에서 하는 방식과 동일하게 static 한정자를 쓰는 거예요.
예를 들어, 다음 프로그램의 출력은 객체 버전을 쓸 때와 같아요.
{$mode objfpc}
type
cl=class
l : longint;static;
end;
var
cl1,cl2 : cl;
begin
cl1:=cl.create;
cl2:=cl.create;
cl1.l:=2;
writeln(cl2.l);
cl2.l:=3;
writeln(cl1.l);
Writeln(cl.l);
end.
출력은 다음과 같아요.
2
3
3
마지막 줄의 코드는 인스턴스(cl1이나 cl2)가 아니라 클래스 타입 자체(cl)를 참조한다는 점에 주의하세요.
정적 필드 방식에 더해, 클래스에서는 Class Var를 쓸 수 있어요. 필드를 var 블록으로 정의하는 것처럼, 클래스 변수는 class var 블록으로 선언할 수 있어요.
{$mode objfpc}
type
cl=class
class var
l : longint;
end;
이 정의는 앞의 것과 동일해요.
클래스 변수는 특정 클래스에 묶여 있어요. 자손 클래스는, 변수가 재선언되지 않는 한 같은 인스턴스를 참조할 거예요. 다음 프로그램이 이를 보여줘요.
{$mode objfpc}
type
TA = class // base type
class var CODE: integer;
end;
TB = class(TA);
TC = class(TA);
begin
TA.Code:=0;
TB.Code:=1;
TC.Code:=2;
Writeln(Ta.Code:2,Tb.Code:2,Tc.code:2);
end.
이 프로그램의 출력은 다음과 같아요.
2 2 2
클래스에 묶여 있기 때문에, 델파이 모드에서는 오버라이드할 수 있어요.
$mode delphi}
type
TA = class // base type
class var CODE: integer;
end;
TB = class(TA)
Class var code : integer;
end;
TC = class(TA)
Class var code : integer;
end;
begin
TA.Code:=0;
TB.Code:=1;
TC.Code:=2;
Writeln(Ta.Code:2,Tb.Code:2,Tc.code:2);
end.
이것은 다음을 출력해요.
0 1 2
하지만 OBJFPC 모드에서는 컴파일되지 않고, 중복 식별자(duplicate identifier) 에러를 주게 돼요.
더 알아보기
클래스 변수는 클래스 전역으로 공유되는 상태예요. 자손 클래스가 재선언하지 않으면 같은 인스턴스를 공유하고, 재선언하면 모드에 따라 오버라이드가 가능해요.