본문 바로가기
퀴즈/캐시워크 돈버는 퀴즈

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

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

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

Access Method

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

보통 C++에서는, private 멤버를 참조하기 위해 Get..., Set...으로 시작

하는 메소드를 두게된다.

 

class MyClass

{

private:

int m_privateInt;

public:

int GetPrivateInt() const;

void SetPrivateInt(); // range checking

};

 

void foo()

{

MyClass myobject;

int MyInt;

MyInt = meobject.GetPrivateInt();

myobject.SetPrivateInt(1);

};

 

델파이에서는 access method 메카니즘에 의해서 보다 편하게 사용 할 수

있는 방법이 제공된다.

 

type

MyClass = class // MyClass = class(TObject)와 등가이다. 델파이

// 에서 TObject를 생략해도 내정적으로 TObject

// 로부터 계승되게된다.

private:

m_PrivateInt: integer;

// range checking

procedure SetPrivateInt(const i: integer);

public:

property PrivateInt: integer

read m_PrivateInt

write SetPrivateInt;

end;

 

procedure foo;

var

myobject: MyClass; // 델파이에서 크래스 객체는 항상 레퍼런스타입

// 이다.

MyInt: integer; // 일반적인 변수형 일 경우에는 C에서와 마찬가

// 지로 스텍상에 타입의 사이즈만큼 정의된다.

begin

myobject := MyClass.Create;

MyInt := myobject.PrivateInt; // 프로퍼티값을 리턴

myobject.PrivateInt := 1;

myobject.Destroy;

end;

 

델파이는 access method를 이용해서, 여젼히 private 멤버를 크래스 안에

숨기면서 간편하게 private 멤버를 엑세스할 수 있다. 이런식으로 델파이

는 Set..., Get... 와같은 함수 이름을 기억해야할 필요성을 없에주는 셈

이된다.

 

 

Pure Virtual Function & Abstract Class

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

델파이에서 추상크래스의 객체 정의는 뭔가 엄격성을 위반한듯한 느낌을준

다. C++과 비교하는 의미에서 설명을하겠다.

 

pure virtual function을 갖는 크래스를 추상크래스라한다. C++에서 pure

virtual function의 정의가 되어있지않은 크래스의 instantiation 은 허용

되지않는다. 다음은 C++ 코드이다.

 

class Base // 추상크래스

{

public:

// pure virtual function

virtual void AbstractMethod(void) = 0;

};

 

class Derived : public Base

{

public:

// 후손 크래스에서 메소드 정의

virtual void AbstractMethod(void);

};

 

void Derived::AbstractMethod()

{

printf("called Derived::AbstractMethod()\n");

}

 

void main()

{

Derived * derivedobject = new Derived;

 

// call Derived::AbstractMethod()

derivedobject->AbstractMethod();

 

// call Derived::AbstractMethod()

((Base *)derivedobject)->AbstractMethod();

 

// Illegal: pure virtual 함수가 정의되어있지않은 Base 크래스의

// 객체 생성(정의)는 위반이다.

Base * baseobject = new Base;

 

// Illegal: 역시 에러가된다.

baseobject->AbstractMethod();

.....

}

 

이와같이 C++에서 미정의된 pure virtual function을 갖는 추상크래스를

정의(생성)하거나, 그 함수를 호출하는것은 위반이다. 그러나 델파이에서

는 이상하게도(본인만 이상하게 생각하는건가???) 이를 허용한다. 물론 런

타임시에 에러가 발생하지만...

 

type

TBase = class(TObject)

public:

procedure AbstractMethod; virtual; abstract;

end;

 

TDerived = class(TBase)

public:

procedure AbstractMethod; override;

end;

 

procedure TDerived.AbstractMethod;

begin

writeln('called TDerived.AbstractMethod');

end;

 

procedure foo;

var

baseobject: TBase;

derivedobject: TDerived;

begin

// C++과는 달리 Illegal이 아니다.

baseobject := TBase.Create;

 

derivedobject := TDerived.Create;

 

// call Derived.AbstractMethod

derivedobject.AbstractMethod;

 

// call Derived.AbstractMethod

TBase(derivedobject).AbstractMethod;

 

// Runtime Error: 미정의된 pure virtual call

baseobject.AbstractMethod;

.....

end;

728x90
반응형

댓글