CHAPTER 21 OBJECTS

이번장에서 다룰 부분은 객체에 대한 부분 입니다. 요사이
각 프로그래밍 언어들 사이에서 많이 다루어 지고 있는
부분중의 하나 입니다. 이곳에서는 기본적인 사용 방법을
예를 통해서 알아 보기로 합니다.

델파이에서 객체는 서브 루틴을 포함하는 레코드와 거의
유사하게 사용이 됩니다.  어쨋든 객체의 형식은  CLASS
라는 명령으로 선언이 됩니다.

TYPE
POINT = CLASS
X,Y: LONGINT;
END;

SCREENTHING = CLASS
LOCATION : POINT;
COLOR:WORD;
END;

이제 두개의 클래스가 선언이 되었읍니다. 두개의 클래스중
SCREENTHING 은 POINT라는 객체를 포함 하고 있읍니다.
이 객체의 사용은

VAR
APOINT : POINT;
ATHING : SCREENTHING;

과 같이 선언이 되며 각 클래스의 변수에 대한 사용은

APOINT.X := 100;
APOINT.Y := 100;
ATHING.LOCATION .X :=100;
ATHING.COLOR :=20;

또는

WITH APOINT DO
BEGIN
X:=100;
Y:=100;
END;
와 같이 사용을 할 수가 있읍니다. 또한 객체안에는 프로시듀어를
포함 할 수 있읍니다. 위의 클래스중 하나를 변경해 보면

SCREENTHING = CLASS
LOCATION : POINT;
COLOR:WORD;
PROCDURE DRAW;
END;

PROCEDURE SCREENTHING.DRAW;
VAR X: INTEGER;
    C: WORD;
WITH SCREENTHING DO
BEGIN
X := LOCATION.X;
C:=COLOR;
END;

이와 같이 사용을 할 수가 있읍니다.  이번에는 상속에 대해서 알아 보기로
합니다. 위의 POINT를 이용해 보지요.

TYPE
TPOINT=CLASS(POINT)
Z : LONGINT;
END;

이때의 TPOINT 는 POINT클래스를 그대로 상속 받고 있읍니다.
이번에는 생성자와 소멸자에 대해 알아 보지요. 생성자는 말 그대로
선언해 주는 역활을 하고 소멸자는 메모리에서 제거해 주는 역활을
합니다.

TYPE
TPOINT = CLASS
X,Y,Z : LONGINT;
CONSTRUCTOR INIT;
END;

CONSTRUCTOR TPOINT.INIT;
BEGIN
X:=0; Y:=0; Z:=0;
END;

TYPE
TFILE = CLASS
SOURCEFILE : TEXT;
DESTRUCTOR DONE;
END;

DESTRUCTOR TFILE.DONE;
BEGIN
CLOSE(SOURCEFILE);
END;

생성자와 소멸자는 객체를 선언할때나 끝날때 자동적으로 작동을
하게 됩니다.  즉 정의를 해 놓으면 사용자가 다시 관여할 필요가
없읍니다.

이번에는 클래스가 선언 되어 있을때 필요에 따라 객체중의 일부분을
수정하여 사용할 필요가 있을때입니다. 이때 원래의 객체를 고치면
되겠지만 그 객체가 다른 곳에도 사용을 하고 있다면 문제가 있겠지요.
그럼 변경하는 방법에 대해 살펴 봅시다. 위에서 정의한
SCREEN THING 이라는 객체를 이용해 봅시다. 그안에
DRAW란 프로시듀어가 있는데, 필요에 따라 몇가지 추가
변경을 한다고 했을때 새로운 객체를 만듭니다.

TSCREEN = CLASS(SCREENTHING)
Z : LONGINT;
PROCEDURE DRAW;
END;

PROCEDURE TSCREEN.DRAW;
BEGIN
INHERITED DRAW;
   {필요한 사항을 추가 합니다}
END;

위와 같이 됩니다. 즉  INHERITED DRAW 라고 해서 앞서 정의된
SCREENTHING의 DRAW를 불러 오고 필요한 사항을 추가,변경
함으로서 새로운 TSCREEN.DRAW를 사용을 할 수 있읍니다.

객체는 사용자가 필요에 따라 만들 수 있지만 이미 만들어 진것도
있지요. 델파이에서 사용하는  TFORM과 같이 T로 시작하는 것들
대다수가 객체 입니다. 필요에 따라서는 각 객체의 특성들을
사용자가 쉽게 이용할 수 있게 해 놓은 겁니다. 앞서의 객 버튼들의
제목등을 사용했을때 그저 그런게 있구나 하고 사용하지만 실제로는
각 해당 객체가 사용되고 있는 겁니다.

이런 객체의 사용에서 한가지 알아두면 도움이 되는 것은
WITH SENDER AS 문 입니다. 앞서 버튼등을 두번 클릭하면
PROCEDURE TFORM1.ONECLICK(SENDER: TOBJECT); 와 같은
문장을 볼수가 있읍니다. 여기서 SENDER, 보내주는 부분의
사용입니다. 이 사용법은  WITH SENDER AS TBUTTON DO 와
같이 됩니다. TBUTTON은 버튼을 표시 합니다.

앞서 계산기 프로그램을 만든것을 기억하세요. 그 계산기를
만들기 위해서 1 부터 9 까지 9개의 버튼을 클릭하고 그
프로시듀어 들마다 해당 사항을 적어 넣었읍니다.

PROCEDURE TFORM1.ONECLICK(SENDER:TOBJECT);
begin
if complete then entry.text : = '';
entry.text := entry.text +'1';
end;

위의 프로시듀어중 틀린것은 맨 뒤의 '1' 부분을 '9' 까지 9번 적어 준
겁니다. 이것은 SENDER를 사용해서 다음과 같이 변경을 시킬수 있읍니다.

PROCEDURE TFORM1.NUMBERCLICK(SENDER : TOBJECT);
begin
if complete then entry.text :='';
with sender as tbutton do
entry.text := entry.text + caption;
end;

문장이 상당히 간단해 졌지요. 즉 TBUTTON의 SENDER를 이용해서
CAPTION의 문자를 바로 이용해 주는 겁니다.

앞의 계산기 프로그램은 이 책에 대한 강좌를 끝낸후 다시 만들어
보기로 합니다. 이상으로 기본적인 설명은 거의 끝난것 같은데,
간단하게 몇개의 예제 문장을 살펴 봅시다.


UNIT DECKCARD;

INTERFACE

TYPE
SUITS=(CLUBS, DIAMONDS, HEARTS, SPADES);
RANKS=(BACK, ACE, TWO , THREE, FOUR, FIVE, SIX,
SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING);
CARDS = RECORD
SUIT : SUITS;
RANK: RANKS;
END;
TCARDDECK = CLASS
DEALT : BYTE;
DECK : ARRAY[1..52] OF CARDS;
  CONSTRUCTOR CREAT;
  FUNCTION CARDNAME(R:RANKS; S:SUITS): STRING;
  FUNCTION DEAL: CARDS;
  FUNCTION RANKOFLASTDEALT(DEPTH:BYTE): RANK;
  PROCEDURE SHUFFLE;
  FUNCTION SUITOF LASTDEALT(DEPTH:BYTE):SUITS;
END;

IMPLEMENTATION

CONSTRUCTOR TCARDDECK.CREATE;
VAR I: INTEGER;
RANK:RANKS;
SUIT:SUITS;
BEGIN
INHERITED CREATE;;
I:=1;
FOR SUIT :=CLUBS TO SPADES DO
FOR RANK:=ACE TO KING DO
BEGIN
DECK[I].SUIT:=SUIT;
DECK[I].RANK:=RANK;
INC(I);
END;
END;

FUNCTION TCARDDECK.CARDNAME(R:RANKS; S:SUITS): STRING;
VAR Q,K: STRING;
BEGIN
CASE R OF
ACE : Q:='ACE';
........
KING:Q:='KING';
END;
CASE S OF
SPADES :K:='SPADES';
......
CLUBS : K:='CLUBS';
END;
CARDNAME := Q+ ' OF ' + K;
END;

.........

FUNCTION TCARDDECK.SUITOFLASTDEALT(DEPTH:BYTE): SUITS;
BEGIN
SUITOFLASTDEALT:=DECK[DEALT-DEPTH].SUIT;
END;

BEGIN
RANDOMIZE;
END.


마지막으로 객체의 접근 상태, 즉 PROTECTED 부분을 살펴 보고 마칩니다.
일반적으로 아무런 선언이 없으면 PRIVATE 상태로 데이타의 접근이 가능
합니다. 하지만 프로그램상의 보안등의 이유로 필요시에는 다른 사람의
접근을 막을 필요가 있읍니다. 그럴 경우 PROTECTED 라고 선언을
하면 됩니다. 아래 에제를 비교해 보고 이번 강좌를 마치기로 합니다.

UNIT PROTECT;

INTERFACE

TYPE
T1 = CLASS
PRIVATE
AFIELD: INTEGER;
END;

T2 = CLASS
PROCEDURE DO1(A0: T1);
END;

IMPLEMENTATION

FUNCTION  ZERO(A0:T1) : BOOLEAN;
BEGIN
ZERO:=A0.AFIELD =0 {사용가능}
END;

PROCEDURE  T2.DO1(A0:T1);
BEGIN
A0.AFIELD :=42;   {사용 가능}
END;

END.

이번에는 PROTECTED 로 변경해 봅니다.

UNIT PROTECT;

INTERFACE

TYPE
T1 = CLASS
PROTECTED
AFIELD: INTEGER;
END;

T2 = CLASS
PROCEDURE DO1(A0: T1);
END;

IMPLEMENTATION

FUNCTION  ZERO(A0:T1) : BOOLEAN;
BEGIN
ZERO:=A0.AFIELD =0 {컴파일이 안됨}
END;

PROCEDURE  T2.DO1(A0:T1);
BEGIN
A0.AFIELD :=42;   {사용 가능}
END;

END.

이 처럼 클래스의 계승에서는 사용이 가능 하나 그외의 펑션이나
프로시듀어등 다른 곳에서는 사용이 불 가능 합니다.

이제 '예제로 배우는 델파이'의 책과 한 강좌는 거의 끝났읍니다.
다음 강좌는 앞서 배운것을 정리하는 식으로 하나의 예제를 소개
하는 것으로 끝내려 합니다. 아니 이 책이 그렇게 되어 있군요.
어쨋든 제대로 설명도 못하고 이 책을 마무리 질래니 좀
찜찜은 하지만 할 수 없지요. 앞서 이야기 한 대로 이 책에 대한
강좌가 끝나고 나면 어떻게 할 까 생각 중이예요. 아직 다른
자료들을 구하지 못해서, 우선적으로 델파이에 포함된 예제나
앞서 잠시 짚고 넘어갔던 계산기및 달력, 시계등을 한 번 만들어
볼까 하기도 하고... 어쨋든 가능하면 분석하거나 만들어 나가면서
이곳에 올려 놓도록 해 보지요.  아! 마지막 장은 내일 중에 마저
정리해서 올리도록 하지요. 그동안 조금이라도 도움이 되었기를
바라며.....

Posted by 나비:D
:
BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total :
Today : Yesterday :