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;
'퀴즈 > 캐시워크 돈버는 퀴즈' 카테고리의 다른 글
키토선생 컵밥 캐시워크 돈버는퀴즈 정답은? 'ㅇㅅ' (0) | 2021.05.12 |
---|---|
하프클럽 슈퍼세일 캐시워크 돈버는퀴즈 정답은? (0) | 2021.05.11 |
센스밸런스 캐시워크 돈버는퀴즈 정답은? (0) | 2021.04.16 |
파이토블락 캐시워크 돈버는퀴즈 정답은? (0) | 2021.04.14 |
손담비 아기모공 클렌저 캐시워크 돈버는퀴즈 정답은? (0) | 2021.04.12 |
댓글