2013년 3월 13일 수요일

델파이 1장 - 2

oop 객체지향 프로그래밍에 대해 살펴 보겠다.
객체 지향이 어쩌구 하는건 OOAD에 설명해놨으니 그거 보라능(내가 귀찮아서 이럼)

먼저 클래스란?
클래스는 속성과 행위를 갖는 레코드형과 비슷한 일종의 자료형이다.
클래스 형으로 정의한 변수는 그 자체가 개체가 되는 것이 아니라
메모리에 자리 잡기 위해서는 인스턴스 하는 작업이 필요한데 이를 생성이라고 한다.

델파이에서 클래스 선언
type
   클래스 이름 = class (부모클래스)
   멤버 선언
end;

부모클래스를 생략하면 TObject를 계승 받는다.

sealed로 표시된 클래스는 상속이 불가능 하다
--------------------------------------------------------------

  • 생성자란?

개체를 생성하고 초기화 하는 동작을 수행하는 루틴
오브젝트가 생성되기 전에 호출되기 때문에 클래스 이름으로 지정해서 호출
Constructor 로 시작하는 프로시저임.

생성자 작성법
Constructor TMyobj.Create; //TMyobj가 클래스명
Constructor TCompoent.Create(AOwner:TCompoent); //TCompoent가 클래스명


  • 파괴자란?

생성자와 반대로 작업을 정리하고 메모리를 해제하는 기능을 수행
Destructor 로 시작하는 프로시저

파괴자 작성법
Destructor TMyobj.Destroy; //TMyobj는 클래스명


  • Free
할당된 개체의 인스턴스를 체크하여 내부적으로 Destroy를 부르는 루틴
Myobj.Free;
--------------------------------------------------------------------------

상속

상속이란?
기존의 클래스를 기반으로 새로운 클래스를 정의하는 것.
이것은 귀찮으니 만든 코드로 설명하겠음 -_-;
----------------------------------------------------------------------------


unit Unit6;

interface
type
TPerson = class(TObject)  //TObject 상속받은 TPerson 클래스 생성
  private //오직 이 클래스에서만 사용
    ttt : String;
  public //다음의 내용은 다른 클래스에서도 사용
    Name : String;
    Age : byte;
    Address : String;
    Constructor Create; virtual; //create의 내용을 상속하여 사용
    function Getname : String;
end;

TEmp = class(TPerson)
public
  office : String;
  Empno : Integer;
  Baserate : real;
  Constructor Create; override; //create를 상속받아 재사용
  function Salary : real; virtual; abstract; //salary 함수 재사용
end;

THourly = class(TEmp)
  Hrs : Integer;
  Constructor Create; override; //create를 재정의하여 사용
  function Salary : real; override; //salary를 재정의하여 사용
end;

TSalary = class(TEmp)
  Salesamt : real;
  Commissionrate : real;
  Constructor Create; override;
  function Salary : real; override;
end;

implementation

{ TPerson }
//사원 정보 입력
constructor TPerson.Create;
begin
  Name := 'Kim';
  Age := 20;
  Address := 'Anywhere';
end;

//사원 이름을 호출하는 함수
function TPerson.Getname: String;
begin
  Result := Name;
end;

{ TEmp }

constructor TEmp.Create; //TPerson에서 정의한 Create를 상속받음
begin
  inherited; //부모클래스의 메소드를 호출하라는 예약어.
  office := 'bbk';
  Empno := 1;
  Baserate := 10;
end;

{ THourly }

constructor THourly.Create;
begin
  inherited;
  Hrs := 10;
end;

function THourly.Salary: real;
begin
  Result := Baserate * Hrs;
end;

{ TSalary }

constructor TSalary.Create;
begin
  inherited;
  Commissionrate := 1;
  Salesamt := 5;
end;

function TSalary.Salary: real;
begin
  result := (Salesamt * Commissionrate) + (Baserate + 40.0);
end;

end.
---------------------------------------------------------------
흐미 이게 뭔소리당가? 한다면 걍 답답할 뿐이다.
설명을 하자면.

TObject -> TPerson -> Temployee -> TSalary
                                                    -> THourly

로 상속을 받은 것이다.

먼저 interface 안에서 클래스를 생성하고 컨트롤 + 시프트 + C를 누르면
implementation 아래에 자동으로 틀이 만들어진다.
설마 이걸 하나하나 친 사람은 없겠지? >.<;
만들어진 틀 안에 코딩하면 된다.
inherited 라는게 있는데 이건 부모 클래스의 해당 이름으로 된 메소드를 호출에서 쓰겠다는 것이다.
친절하게 곳곳에 주석도 달았으니 알아서 보길 바란다.(어차피 보는 사람도 적은데 츤츤)

다음에는 컴포넌트를 사용해서 간단하게 만들어 보겠다~
다음이래봐야 잠깐 쉬고 쓸꺼다 -_-
길면 읽지를 않으니 원.

댓글 없음:

댓글 쓰기