반응형

객체 기록용으로 쓴 것이긴 한데,

 

객체, 오브젝트, 상속 개념을 많이 힘들어하는 분들을 위해

간단히 객체 상속 개념 대해서도 설명 추가 했습니다. (편의상 일부 반말로 설명 합니다.)

일단 개념만 알면 , 활용하는 건 쉬우니까요.

 

제가 델파이 프로그래머라 , 델파이로 설명하겠습니다.


unit Unit1;  {정의 부분 , 그냥 패스 요~}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;


{객체 정의 부분}

 

type                              //항상 type 밑에 코딩을 합니다.


  Ttest1= class(Tobject)     //최초의 오브젝트의 조상은 Tobject 이다. 

                                     //Tobject 는 객체의 생성 파괴등 근본적인 기능을 가지고 있다.
                                     //Ttest1은 Tobject 의 클론이므로 (방금 위에서 상속 받으므로   Ttest1= class(Tobject))

                                     //Ttest1 은 Tobject 의 모든 함수와 변수를 이어받게 된다

                                     //T 을 붙이는 이유는 , 델파이의 전통에 따르기 위함이다. 다른 걸 써도 된다.....
  private                          //Ttest1 클랙스 내부에서 사용될 변수나 함수 정의


    a,                           
    b,                            
    c : integer;                  

  public                       //Ttes1 내, 외부에서 참조할, 변수나 함수 정의

    constructor Init;         //Ttes1 객체 생성자
    destructor Free;         //Ttest 객체 파괴자


    function resultC : integer;           //a+b 결과 값을 가져올 함수 선언

 

                                                 //property 함수 코딩 없이 바로 변수를 읽고 쓴다

                                                 //별도 코드 작성 필요 없음
    property SetA :integer write a;      //a 변수 값을 쓰는 property  
    property SetB :integer write b;      //b 변수 값을 쓰는 property 

 

    property GetOrSetC: integer read c write c; //c 변수  값을 읽거나 쓸 수 있는 property
                                                             
  end;

 

 


상속의 개념을 설명하기 위해 하나 더 객체를 만듭니다.



  Ttest2= class(Ttest1)              //Ttest2 의 오브젝트의 조상는 Ttest1 이다.
                                          //Ttest2 는 Ttest1 의 모든 기능이 상속되는 클론이다.
                                          //그래서 Ttest2는 Ttest1 의 모든 변수와 함수를 가지게 있다

 

                                          //Test1은 Tobject를  상속받았으므로

                                          //Ttest2는 Test1과 Tobject 함수와 변수를 상속 받게 되게 된다

                                          //모든 변수나 함수가 포함되어 있으므로

                                          //그래서 별도의 생성자도                      constructor Init;
                                          // 파괴자 함수를 만들지 않아도 된다.       destructor Free;

                                         

  private


    d:integer;                          //test1 의 객체를 상속받았으므로 자동으로  test1 객체의 a,b,c : integer 변수와

                                          // function resultC : integer; 함수가 포함되어 있다.

                                         // 변수값을 읽고 쓸 property 선언 도 역시 포함되어 있다
  public


    function resultD:integer;        //a+b+c 값을 가져올 함수 선언


  end;

 


참고 설명.

처음 델파이를 실행하여 메뉴에서 new application 선택하면,

폼(Form) 과 함께 위와 같은 소스가 나옵니다.

 

위 빨간 줄에서 볼수 있듯이

지금 만들어진 폼(TForm1)은 TForm 의 클론(자식) 입니다.

TForm1 은 TForm 의 모든 변수와 함수를 상속 받게 됩니다.

그래서 별도의 변수나 함수 선언및 코딩 없이 TForm1 은 TForm 과 똑같이 동작하게 됩니다.

 

그리고 프로그래머가 button,listbox 등 콤포넌트를 추가해서

개인적인 코드를 만들어 나갈수도 있는 것입니다.

 

만일 상속받아 만든 TForm1 그것이 근본이 되는 코딩이라 할때 다시

TformX=class(TForm1) 처럼 상속 시켜서 사용할수 있습니다.

 

 


위 객체 정의에 이어서 Ttest 코드 작성

implementation 정의 밑으로 작성, 

 

 

constructor Ttest1.Init; {객체 생성자}
begin
  inherited Create;

  {만일 객체 생성자 안에 별도의 코드를 작성한다면, 항상 이곳에 코딩}
end;

 

 

destructor Ttest1.Free; {객체 파괴자}
begin

  {만일 프로그램 파괴자 안에 별도의 코드를 작성한다면, 항상 이곳에 코딩}

  inherited Destroy;
end;

 

 

{a + b 결과 값 갖기 함수 코딩}  
function Ttest1.resultC: integer;
begin


  result:=a+b;
  c:=a+b;


end;


 

{ Ttest2 객체의 함수를 정의

a+b+c 값 결과를 가져올 함수} 
function Ttest2.resultD: integer; 
begin 


  d:=a+b+c; 
  result:=d; 


end;

 

 


 

//코딩 내에서 실제 사용법 
var
  abPlus:Ttest1;  //사용할 객체를 선언

  abPlus2:Ttest2; //사용할 객체를 선언 (실제 메모리 상에 입력 되는건 아니고 코딩을 위해 선언만 하는것임)


begin
                                           
  abPlus:=Ttest1.init;                 //선언한 객체를 사용하기 위해선,객체를 생성해야 함.

           

                                         // property 로 정의한 부분
  abPlus.SetA:=1;                    //a 에 1 을 입력
  abPlus.SetB:=2;                    //b 에 2 를 입력


  form1.caption:=inttostr(abPlus.resultC);  //캡션 바에 결과를 출력해본다. 

 

  form1.caption:=inttostr(abPlus.GetOrSetC)      //a+b 값 c 값을 property 로 직접 가져와도 된다.

 

  abPlus.free;  //사용후, 객체를 해제해서 메모리에서 제거해야 함


 //-------------------------------------------------------------------

  abPlus2:=Ttest2.init;  //a+b+c 값을 구하기 위한 객체를 정의 (Ttest1 를 상속받은 객체)

  abPlus2.SetA:=3;          //상속으로 이미 포함되어 있는 객체의 property    
  abPlus2.SetB:=4;

 

  abPlus2.resultC;         //이렇게 C값을 계산하는 함수를 호출해도 된다.

                               //상속으로 이 함수를 이미 포함하고 있기 때문

  

  form1.caption:=inttostr(abPlus2.resultD); //a+b+c 더한 값 D 결과 값을 가져 오는, 객체의 함수를 호출

 


  abPlus2.free;         //a+b+c 값을 구하기 위한 객체를 해제
end;

 


객체를 사용하면서 느낀 편리한 점은,,

 

예로 그림데이터를 다룰때 ,

그림 하나당 하나의 객체로 만들어 관리하면 편하구요.

고객 관리같은 프로그램 경우도 손님 한명당 하나의 객체로 만들어 처리할수 있겠습니다.

 

게임 프로그램을 할때,

캐릭 하나당 하나의 객체로 만들어서 처리하면 편하더군요

예로 총알하나 적 비행기를 전부 하나당 한 객체로 처리할수 있겠네요.

procedre function 로 일괄 처리하는것보다 편한것 같습니다.

 

상속으로 인한 코딩의 편리함보단,

상속을 잘못 코딩하면, 복잡함이 증가하니

잘 설계해서 코딩을 해야 할것 같습니다.


보관용 코드

 

  Ttest1= class(Tobject)
  private                   

  public    
    constructor Init;
    destructor Free;

 

    property SetA :integer write a;  

    property GetOrSetC: integer read c write c;                                                              
  end;

 

constructor Ttest1.Init; 
begin 
  inherited Create; 
end;

 

destructor Ttest1.Free; 
begin 
  inherited Destroy; 
end;

 

 

 

var 
  abPlus:Ttest1; 

abPlus:=Ttest1.init;  

 

abPlus.free;  

반응형

+ Recent posts