본문 바로가기
Delphi/Delphi란?

Delphi OOP와 C++과의 차이 [1]

by MonoSoft 2021. 4. 27.
728x90
반응형

Delphi OOP와 C++과의 차이 [1]

 

볼랜드의 델파이는 마이크로소프트사의 Visual Basic을 겨냥해서 만들어진

듯하다. 원하는 스타일의 버튼 또는, 스크롤바 객체를 마우스로 선택해서

Form 위에다 올려주는것만으로도 어지간한 유져인터페이스는 코딩없이,

플리케이션을 만들어주는 상당히 직관적인 비쥬얼 환경이다.

 

델파이는 PASCAL OOP 랭귀지를 사용한다. 보다 나은 애플리케이션을 만들

려면 OOP에 대한 이해가 필요할것이다. C++만 이용하다가 PASCAL OOP를 다

룬지는 한달이 채 안되는거 같다. 본 강좌에서는 PASCAL OOP와 C++를 비교

하는 식으로 DelphiOOP를 설명하겠다.

 

 

C++ 스펙에서 빠진 사항들

========================

볼랜드사는 델파이를 RADical 개발 툴이라고한다.(Rapid Application Dev-

elopment) 델파이 OOP에서는 다음과 같은 스펙이 지원되지않는다.

 

1. Multiple inheritance.

2. Template.

3. Function overloading.

4. Operator overloading.

5. Friend etc...

 

일반적으로 상용으로 나와있는 C++ 크래스라이브러리들에서도 선형적인 인

터페이스를 위해서 다중상속을 이용하지않는것이 보통이다. 따라서 델파이

가 다중상속을 지원하지않더라도 응용프로그램 개발에는 큰 장애가 없을것

이다. 볼랜드에 의하면 빠른 컴파일 속도(RAD)를 위해서 나머지 4개의 스

펙을 지원하지않은것으로 안다.

 

 

C++에는 없고 델파이 OOP에서 추가된것들

======================================

델파이 OOP에서 다음과 같은 스펙이 추가되었다.

 

1. Dynamic virual method

C++에서 버추얼함수의 VMT테이블은 실행화일에 놓여졌지만

델파이는 추가적으로 런타임시에 VMT 테이블을 생성하게하

는것이 가능하다.

2. Private Class' field 엑세스

access method를 통해서 참조가 가능하다.

3. Published component identifier

런타임시에 프로퍼티를 초기화하기 위해서 비쥬얼 컴포넌트

라이브러리(VCL)에 의해서 사용된다.

4. Multiple destructor

델파이에서는 명시적으로 디스트럭터를 호출하는것이 가능

하고 이에따라, 디스트럭터가 파라미터를 갖을 수 있고,

하나의 크래스상에 복수의 디스트럭터가 있을 수 있다.

 

 

스텍 베이스의 객체 정의 & 생성자 . 소멸자

=================================================

델파이에서 객체는 Reference 타입으로 사용되고, 스텍상의 객체 정의를

지원하지않기때문에 명시적으로 힙으로부터 할당되어야한다. 생성자와 소

멸자 역시 C++과 다른점을 갖는다.

 

예를들어...

 

void foo() // C++

{

// 스텍상에 객체가 정의되고, 자동적으로 생성자가 호출된다.

MyClass myobject;

...

// 스코프에서 벗어날때 객체는 자동적으로 소멸되고, 디스트

// 럭터가 호출된다.

}

 

procedure foo; // 델파이

var

myobject: MyClass; // 스텍상에는 레퍼런스타입만 존재하고 실질

// 적인 객체는 정의되지않는다.

begin

// 명시적인 생성자에 의해서 객체가 힙으로부터 생성된다.

myobject := MyClass.Create;

...

// 역시 명시적인 소멸자의 호출에 의해서 객체가 소멸된다.

myobject.Destroy;

end;

 

 

따라서 위의 델파이 코드는 아래의 C++ 코드와 등가적인 메카니즘을

갖는다고 볼 수 있다. 델파이에서 객체는 항상 레퍼런스타입이라는

것에 주의하도록한다.

 

void foo()

{

MyClass& myobject = *(new MyClass);

delete &myobject;

}

 

 

또한, 델파이에서 생성자와 소멸자는 자동으로 호출되지않기때문에 드라이

브할때, 명시적으로 호출해주어야한다. C++과 비교해보면...

 

class Base

{

Base();

~Base();

...

}

 

class Derived : public Base

{

Derived();

~Derived();

...

}

 

Derived::Derived()

{

...

}

 

Derived::~Derived()

{

...

}

 

void foo()

{

Derived derived;

}

 

위의 C++ 코드는 델파이에서 다음과 같이 작성되어 질 수 있다.

 

type

TBase = class

public

constructor Create; virtual;

destructor Destroy; virtual;

end;

 

TDerived = class(TBase)

public

constructor Create; override;

destructor Destroy; override;

end;

 

constructor TDerived.Create;

begin

// 명시적으로 먼저 선조의 생성자를 호출해주어야한다.

inherited Create;

.... <-- custom codes here.

end;

 

destructor TDerived.Destroy;

begin

.... <-- custom codes here.

// 명시적으로 커스텀 코드이후에서 소멸자를 호출해주어야한다.

inherited Destroy;

end;

 

procedure foo;

var

derivedobject: TDerived;

begin

derivedobject := TDerived.Create;

derivedobject.Destroy;

end;

 

델파이에서는 사용자가 명시적으로 생성자와 소멸자를 호출해주어야하는

불편한 점도 있지만, 이런 점때문에 생성자와 소멸자의 심볼네임이 C++ 에

서와 같이 크래스네임과 같을 필요가 없어진다. 보통 델파이에서 생성자와

소멸자의 심볼네임은 각기 Create, Destory 로 하는것이 일반적이다.

 

생성자와 소멸자 둘다 Virtual 로 정의될 수 있고, 각기 다른 파라미터를

갖는 소멸자가 복수개 정의될 수 도 있다.

 

델파이가 자동으로 생성한 콤퍼넌트 객체는 다른 메카니즘을 갖는다.

가령, 마우스로 버튼 콤퍼넌트를 폼에다 삽입하면...

 

type

TForm1 = class(TForm)

button1: TButton;

public:

myclass: TMyClass;

...

end;

 

콤퍼넌트 TButton 객체는 public, protected, private 등의 지정자가 없는

위치에 자동으로 델파이에 의해서 정의되어지는데, TMyClass 객체가 명시

적으로 생성자및 소멸자를 호출해주어야하는 반면에, TButton 객체는 델파

이의 메카니즘에 의해서 자동적인 처리가된다. 즉, 델파이의 비쥬얼 환경

에 의해서 생성된 객체는(콤퍼넌트를 마우스로 폼 위에다 삽입하는 경우)

는 다른 메카니즘을 갖는다. 확장자 xxx.dfm 화일을 델파이의 에디터 환경

에서 오픈해서 살펴보면, 콤퍼넌트의 프로퍼티들이 정의되어있는것을 알수

있을것이다. xxx.frm 화일에 정의되어있는 프로퍼티들은 컴파일시에 실행

화일속으로 입혀진다. 그리고 이런 프로퍼티들은 Persistent 메카니즘에의

해서 런타임시에 객체 활동과 맞물리게된다.

728x90
반응형

'Delphi > Delphi란?' 카테고리의 다른 글

Delphi OOP와 C++과의 차이 [5]  (0) 2021.04.30
Delphi OOP와 C++과의 차이 [3]  (0) 2021.04.28
Delphi란...{6}  (0) 2021.04.26
Delphi란...{4}  (0) 2021.04.26
Delphi란...{3}  (0) 2021.04.23

댓글