[Public]

Public지시어는 특별한 제한을 갖고있지 않는 필드나 메소드를 나타낸다. 메소드가 Public으로 선언되면 클래스의 어떤 사용자도 사용할 있다.

 

[Private]

Private 지시어는 클래스가 정의된 Unit 외부에서 접근하거나 알아보지 못하도록 프로시저, 함수나 필드를 정의하기 위해 사용된다. Private 선언된 식별자의 범위는 선언을 포함하는 모듈로 제한된다. 같은 Unit에서 정의된 개체는 서로의 Private 필드와 메소드를 사용할 있다.

 

[Pretected]

Protected지시어는 Public Private중간형태로 파생 클래스이면 상위 클래스의 모든 정보를 참조하여 사용할 있다.


Unit UnitA;

type

   TA = Class(Tobject);

   Private

      PriA : Integer;

   Protected

      ProA : integer;

   Public

      PubA : Integer;

   Procedure Access;

End;

 

Procedure TA.Access;

Begin

   PriA := 1;      // OK

   ProA := 2;     // OK

   PubA := 3;     // OK

End;


Unit UnitB;

Uses UnitA;

type

   TB = Class(TA);

   Public

      Procedure Access;

End;

 

Procedure TB.Access;

Begin

   PriA := 4;       // 오류 발생 : Undeclared identifier

   ProA := 5;      // OK

   PubA := 6;      // OK

End;


UnitA 선언된 TA클래스의 메소드에서는 TA클래스에서 선언된 모든 멤버(private, protected, public) 참조할 있다.

그러나 TA클래스에서 계승받아 UnitB 선언된 TB클래스는 TB클래스가 후손 클래스이고 TA클래스는 선조 클래스이다. 후손 클래스에서는 선조 클래스의 멤버 Private영역의 멤버를 참조하지 못한다.

따라서 TA 클래스의 Private 선언되어 있는 PriA TB클래스에서 사용할 없다. 당연히 에러가 발생할 밖에…..


그리고, 한가지 유의해야 점은 TA클래스의 변수 A 생성하여 사용한다고 가정할 , TA클래스의 사용자는 TA클래스에서 public으로 선언한 멤버만을 참조할 있다.(아래)

Unit UserUnit;

uses UnitA;

procedure TForm1.Button1Click(Sender: Tobject);

var

   A : TA;

Begin

   A := TA.Create;

   A.priA := 7;               // 오류 발생 : Undeclared identifier

   A.proA := 8;              // 오류 발생 : Undeclared identifier

   A.pubA := 9;              // OK

A.  Free;

End;


+ Recent posts