프로그래밍 노트

델파이의 클래스 본문

델파이

델파이의 클래스

띠리 2007. 7. 10. 22:17

클래스를 씀으로써 델파이를 오브젝트 파스칼이라 할수있다.
델파이에 있어서 클래스처럼 중요한 요소는 없을찌도 모른다.
클래스를 이해하고 클래스를 잘써야지만 델파이를 잘쓴다고 할수있을것이다.
클래스는 오브젝트 그자체가 아니라 오브젝트를 만들기 위한 설계도나 거푸집 같은 것이다.
오브젝트는 클래스를 인스턴스화(거푸집으로 클래스를 사용하여 실제 물건을 만드는 것같은 것)하는 것으로 만들 수 있다.
델파이의 프로그램은 1개 이상의 클래스를 정의하는 것에 의해 이루어져있다.
그리고 자동적으로 만들어지는 어플리케이션 오브젝트가 유저가 정의한 클래스를 인스턴스화 하여 어떤 동작을 실행시키도록 되어있다.

보통 비쥬얼 컴포넌트의 인스턴스화는 델파이가 자동적으로 해준다.
예를 들어 폼이나 폼에 붙어있는 버튼등도 클래스지만 이것의 인스턴스화는 자동으로 이루어진다.
그러나 설계할 때도 실행할 때도 보이지않은 컴포넌트(클래스)는 유저가 프로그램을 짜는 것에 인해 인스턴스화 할 필요가 있다.

클래스의 구조

클래스의 일반 형식은 다음과 같다.

<클래스의 이름> = class<Heritage(상속)>
    <컴포넌트 리스트> 또는 <가시성지정자>의 열거
end;

클래스의 이름은 예를 들면 TForm1같은 것이다.
Heritage(상속)는 괄호()로 쌓여있있는 오브젝트의 타입 이름으로 예를 들면 TForm같은 것이다.
Heritage(상속)는 기본 클래스의 성질을 그 클래스에 이어받았을 때 사용한다.(즉 생략가능하다.)
일반적으로 모든 새로운 클래스를 만들때에는 귀찮기 때문에 이미 있는 클래스(특히 델파이가 가지고 있는 클래스)의 기능을 사용할수 있도록TForm이나 TComponent등을 지정한다.
컴포넌트 리스트는 필드 정의, 메소드 정의, 프로퍼티 정의의 열거이다.
필드의 정의는 멤버 변수(클래스의 속한 변수)이다.
메소드의 정의는 그 클래스의 속한 함수(procedure, function)이다.
프로퍼티 정의는 Property로 시작하는 행으로 함수를 맴버 변수처럼 보이게한다.

프로퍼티 종류 기능
private 클래스 안에서만 사용가능
protected 클래스 안에서와 계승에 의해 파생된 클래스에서 사용가능
public 클래스 밖에서도 사용가능
published 클래스 밖에서도 설계할 때(오브젝트 인스펙터로)에 사용가능


다음의 클래스는 델파이가 자동적으로 생성한 폼의 일부이다.
TForm1 = class(TForm)으로부터 private까지는 델파이가 관리하고 있기 때문에 에디터로 고치면 안된다.

클래스의 예

TForm1 = class(TForm)
    Label1: TLabel;
    txtName: TEdit;
    cmdCreate: TButton;
    cmdClose: TButton;
    ...
    procedure cmdCloseClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure cmdReadClick(Sender: TObject);
    procedure cmdWriteClick(Sender: TObject);
    procedure cmdClearClick(Sender: TObject);

  private
    { Private 선언 }
    FHandle: Integer;

  public
    { Public 선언 }
    constructor Create();
    destructor Destroy();
    procedure SetData(d: Integer);
    function IsValid(): Boolean;
  end;

■ 메서드
메서드는 클래스에 속한 procedure나 function이지만 클래스 정의 밖에(implementation부) 실제 프로그램은 쓴다. 메서드는 어떤 클래스에 속한 것인지 구별하기 위해 메서드 앞에는 클래스의 이름이 붙는다.

사용예
procedure TForm1.SetData(d: Integer);
begin
....
end;

컨스트럭터(constructor)와 디스트럭터(destructor)는 특수한 메서드이다.
컨스트럭터는 클래스가 인스턴스화 되어질때의 초기 처리를 행한다. 디스트럭터는 클래스의 인스턴스가 메모리로 부터 삭제 될때 처리된다.

프로퍼티
프로퍼티는 클래스의(private 나 protected) 맴버 변수를 읽거나 쓸때 사용한다.
프로퍼티는 단순하게 읽고 쓰기만 아니라 그 동작이 일어났을때 무언가 다른 동작도 동시에 하고 싶을때 유용하다.
프로퍼티의 일반적인 문법은 아래와 같다.

사용예

proporty Volume : Smallint read GetVolume write SetVolume default 0;

(stored나 nodefault등의 키워드도 있지만 생략함)

이것은 Volume프로퍼티를 읽을때는 GetVolume메서드를 호출하고 쓸때는 SetVolume 메서드를 호출하는 것을 나타낸다. default 0은 디폴트 값 지정으로 오브젝트 인스펙터로 표시되어진다. 필요없는 경우는 이것의 메서드 지정이나 디폴트를 생략할 수 있다.
또 메소드 지정 대신에 직접 메서드 변수를 지정할 수도있다.

■ 클래스의 계승
클래스의 계승은 오브젝트 지향의 좋은 기능중에 하나이다.
클래스를 계승하면 계승한 클래스(파생 클래스)는 계승되어진 클래스(기본 클래스)의 기능을 그대로 이어받을 수 있다. 예를 들면 기본 클래스의 적분을 하는 메서드가 있을때(private가 아닐때), 이것을 파생 클래스에서 다시 적분하는 메서드를 따로 만들지않고 기본 클래스의 메서드를 유용할 수 있다.

클래스의 계승은 클래스의 구조로 씌여진 상속에 기본 클래스명을 지정하는 것으로 간단히 계승할 수 있다. 단 컨스트럭터로 기본 클래스의 컨스트럭터를 호출할 때는 inherited 예약어를 사용하여 기본 클래스의 컨스트럭터를 불러야만된다.

사용예

constructor TMyClass.Create;
begin
  ingerited Create;
  ....
end;

하지만 계승을 하여도 기본 클래스의 private메서드와 변수는 조작 할수없다.

 
Comments