대가리 먼저 디자인패턴을 보고 있습니다. 그런데 자바는 메모리를 해제하는 개념이 없어서 책에 아나와 있더군요.
그래서 걍 제 마음대로 설정을 하고 해제를 하곤 합니다만... 이게 맞는지 모르겠습니다.
일단 소스 한번(...)
// 중간의 fly와 Quack에 대한 클래스의 상태는 생략합니다.
// 최상위 클래스인 Duck만 봐도 책 보신 분들이나 잘 아시는 분은 이해가 되실 듯.
class Duck {
protected:
FlyBehavior* fly;
QuackBehavior* quack;
public:
void SetQuack(QuackBehavior *Other) { quack = Other;}
void SetFly(FlyBehavior *Other) { fly = Other; }
void GetDuckState() {
quack->Quack();
fly->Fly();
}
~Duck() { ///문제는 바로 요 부분. 메모리를 설정한 곳을 해제를 여기서 했습니다만... 이게 해제가 잘 됬는지 의문이네요. virtual 형식으로 선언을 하면 Duck을 상속한 클래스들도 한 번씩 돌아보는 것 같던데요.. 이 부분이 맞나 함 여쭤봅니다.
cout << "메모리를 해제합니다" << endl;
delete fly;
delete quack;
}
};
class RubberDuck : public Duck {
public:
RubberDuck() { fly = new NoWing(); quack = new NoQuack(); }
~RubberDuck() { cout << "고무오리 지워야 해요" << endl; } ///이 부분이 안 뜨는 것을 보니 정답인 것 같기도 하고요=_=
};
class RedHeadDuck : public Duck {
public:
RedHeadDuck() { fly = new Wing(); quack = new MouthQuack(); }
~RedHeadDuck() { cout << "빨간오리 지워야 해요" << endl; }
};
void main()
{
Duck *rubberduck = new RubberDuck();
rubberduck->GetDuckState();
delete rubberduck;
}
--------------------------------------
여담이지만 요즘들어 언어 공부가 너무 즐겁습니다. 즐거워 미칠지경입니다-ㅁ-;;; 바람직한 현상이라 생각하면서 오늘도 머리를 싸매고 있습니다. 넵.
동적으로 생성된 객체는 생성한 곳에서 지워야 더 명확하지 않을까요?
Duck이 메모리에서 내려간다고 해서 FlyBehavior와 QuackBehavior가 함께 지워져야 할 이유는 없으리라 봅니다.
FlyBehavior* pFlyB = ...;
QuackBehavior* pQuackB = ...;
....
Duck* duck1 = ....;
Duck* duck2 = ....;
....
duck1.SetQuack(pQuackB);
duck2.SetQuack(pQuackB);
....
delete duck1;
이런 코드가 있을때 duck2 는 잘못된 메모리를 참조하게 됩니다. duck1이 메모리에서 사라질 때 duck2가 참조하고 있는 QuackBehavior를 삭제하기 때문이죠.