객체 기록용으로 쓴 것이긴 한데,
객체, 오브젝트, 상속 개념을 많이 힘들어하는 분들을 위해
간단히 객체 상속 개념에 대해서도 설명 추가 했습니다. (편의상 일부 반말로 설명 합니다.)
일단 개념만 알면 , 활용하는 건 쉬우니까요.
제가 델파이 프로그래머라 , 델파이로 설명하겠습니다.
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;
'프로그램잉_기타 > 델파이' 카테고리의 다른 글
델파이 ( C++ 빌더) 커뮤니티 에디션 , 프리 버전 받기 (0) | 2020.05.13 |
---|---|
델파이 repeat, while 문 조건 부분 쉽게 이해하기 (0) | 2019.08.11 |
델파이에서 변수 선언 기본, 전역 변수 및 유닛간 참조 호출 방법 (0) | 2019.06.26 |
델파이 6,7 컴파일 옵션 간단 설명(기록 보관용) (0) | 2019.02.09 |
델파이 포인터 형식 간단 설명(기록용) (0) | 2018.10.25 |