클래스·정적 필드

클래스·정적 필드 (Class or Static Fields)

객체 안에 클래스 필드 또는 정적 필드를 담을 수 있어요. 이런 필드는 객체 타입 단위로 전역이며, 전역 변수처럼 동작하되 객체의 유효 범위 안에서만 알 수 있어요. 정적 변수와 클래스 변수의 차이는 순전히 동작하는 모드에 있어요. static 키워드는 항상 동작하고, class 키워드는 {$MODE DELPHI} 또는 {$MODE OBJFPC}가 필요합니다.

출처: Class or Static fields

본문

이런 필드는 객체의 메서드 안에서 참조할 수 있고, 객체 바깥에서는 완전한 이름(정규화된 이름)으로 참조할 수 있어요.

예를 들어 다음 프로그램의 출력을 볼게요.

{$mode objfpc}

type
  cl=object
    l : longint; static;
    class var v : integer;
  end;

var
  cl1,cl2 : cl;

begin
  Writeln('Static');
  cl1.l:=2;
  writeln(cl2.l);
  cl2.l:=3;
  writeln(cl1.l);
  Writeln(cl.l);

  Writeln('Class');
  cl1.v:=4;
  writeln(cl2.v);
  cl2.v:=5;
  writeln(cl1.v);
  Writeln(cl.v);
end.

출력은 다음과 같아요.

Static
2
3
3
Class
4
5
5

마지막 줄의 코드가 객체 타입 자체(cl)를 참조하지, 객체의 인스턴스(cl1이나 cl2)를 참조하지 않는다는 점에 주목하세요. static·class 필드는 인스턴스가 아니라 타입 단위로 공유되기 때문에, 어떤 인스턴스로 값을 바꿔도 공통 값이 변하는 걸 확인할 수 있어요.

더 알아보기