객체 선언

객체 선언 (Declaration)

Free Pascal은 객체 지향 프로그래밍을 지원해요. 사실 컴파일러 자체가 대부분 객체로 작성되었을 정도죠. 여기서는 Free Pascal에서 객체 지향 프로그래밍을 다룰 때 필요한 몇 가지 기술적인 내용을 살펴볼게요.

출처: Declaration

본문

객체는 레코드의 특별한 종류로 생각하면 돼요. 객체에는 객체 정의에 선언된 모든 필드와, 객체 타입에 연결된 메서드에 대한 포인터가 들어 있어요.

객체는 레코드를 선언하듯이 선언하면 되는데, 이번에는 프로시저와 함수도 레코드의 일부처럼 선언할 수 있어요. 객체는 '부모' 객체로부터 필드와 메서드를 '상속'받을 수 있어요. 즉, 자식 객체에 직접 포함된 것처럼 그 필드와 메서드를 사용할 수 있다는 뜻입니다.

여기에 가시성(visibility) 개념도 도입돼요. 필드, 프로시저, 함수를 public, protected, private로 선언할 수 있어요. 기본적으로 필드와 메서드는 public이며 현재 유닛 바깥으로 공개됩니다.

private로 선언된 필드나 메서드는 현재 유닛 안에서만 접근할 수 있어요. 그 유닛의 구현부로 범위가 제한되는 거죠.

객체의 원형 선언은 다음과 같아요.

객체 타입의 문법 다이어그램에서 보듯이, 어떤 가시성 블록이든 원하는 만큼 여러 번 반복해서 지정할 수 있어요. 특별한 순서도 필요 없고요.

객체의 유효한 정의 하나를 볼게요.

Type
  TObj = object
  Private
    Caption : ShortString;
  Public
    Constructor init;
    Destructor done;
    Procedure SetCaption (AValue : String);
    Function GetCaption : String;
  end;

여기엔 생성자/소멸자 쌍과, 캡션을 설정하고 읽는 메서드가 있어요. Caption 필드는 객체에 private이기 때문에 TObj가 선언된 유닛 바깥에서는 접근할 수 없습니다.

Remark MacPas 모드에서는 다른 Mac용 파스칼 컴파일러와의 호환을 위해 Object 키워드가 class 키워드로 대체돼요. 즉 MacPas 모드에서는 객체를 사용할 수 없다는 뜻이에요.

Free Pascal은 packed object도 지원해요. 일반 객체와 같지만, packed record처럼 객체의 필드가 바이트 단위로 정렬된다는 점이 달라요. packed object 선언도 packed record 선언과 비슷합니다.

Type
  TObj = packed object
   Constructor init;
   ...
   end;

  Pobj = ^TObj;

Var PP : Pobj;

마찬가지로 {$PackRecords } 지시어도 객체에 적용돼요.

더 알아보기