클래스 필드/변수

클래스 필드/변수 (Class fields/variables)

객체와 비슷하게, 클래스는 정적 필드 또는 클래스 변수를 담을 수 있어요. 이 필드나 변수는 클래스에 전역이고, 전역 변수처럼 동작하지만 클래스의 일부로만 알려져 있어요. 클래스의 메서드 안에서 참조할 수 있고, 클래스 밖에서도 정규화된 이름으로 참조할 수 있어요.

출처: 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) 에러를 주게 돼요.

더 알아보기

클래스 변수는 클래스 전역으로 공유되는 상태예요. 자손 클래스가 재선언하지 않으면 같은 인스턴스를 공유하고, 재선언하면 모드에 따라 오버라이드가 가능해요.