안녕하세요.
TList 클래스를 사용하다가 궁금한 점이 있어서 질문 드립니다.
TList의 메모리 해제를 위해 TLIst.Delete를 대치하려고 합니다.
즉, 현재의 TList.Delete는 단순히 포인터만을 없애주지만,
TList를 상속받은 TDerivedList에서는 TDerviedList가 저장하려는
데이터를 직접 Free, Dispose 한 이후에 포인터를 삭제하려고 합니다.
가령 TStudentList = class(TList) 를 사용한다고 하면,
TStudentList.Delete를 아래와 같이 만들고 싶은거죠.
procedure TStudentList.Delete(Index : Integer);
begin
TPStudent(Items[Index])^.Free;
Dispose(TPStudent(Items[Index]));
inherited Delete(Index);
end;
이렇게 하여 TStudentList가 가지고 있는 TStudent의 인스턴스가
가지고 있는 자원을 모두 Free, Dispose 할려고 합니다.
그런데 궁금한점은, TList.Delete가 Static 메소드라는 점입니다.
Virtual이나 Dynamic으로 되어 있지 않기 때문에,
기본적으로 Override가 가능하지 않습니다.
Ek라서 TStudentList에서는 그냥
procedure Delete(Index : integer);
이렇게 선언해서 사용하는데요.(override 키워드가 없죠)
이럴경우 Derived 클래스의 메소드가 조상클래스 메소드를
완전히 '대치(Replace)'한다고 되어 있더군요.
이 Replace의 의미를 잘 모르겠습니다.
더욱 중요한 것은,
TList에서 아이템을 해제하는 모든 메소드는 내부적으로 TList.Delete를 호출하게 되는데요.
따라서 만약 TList.Delete가 Virtual로 선언되어 있다면,
TList.Delete만을 Override 함으로써 모든 TList의 아이템 제거 메소드들이
제대로 리소스를 해제하도록 만들 수 있습니다.
(TDerivedList.Delete가 수행될테니까요)
하지만 TList.Delete가 Virtual함수가 아니고,
이를 재정의 하여 사용함으로 인해 어떤 다른 양상이 생기는지 모르겠습니다.
가장 중요한것은, TStudenetList의 Remove, Clear등을 수행할때,
내부에서 호출되는 Delete가 TList.Delete인지
TStudentList.Delete인지 입니다.
만약 후자라면 원한대로 자원해지가 되겠지만,
전자의 경우라면 리소스가 해지가 되지 않을 것이며,
이를 해결하기 위해서는 리소스를 해지하는 모든 메소드를
전부 다 Derived클래스에서 재정의해 사용해야 할것입니다.
(Remove, Clear, Destroy 등등..)
과연 Static메소드의 재정의(책에 이렇게 나와있었던듯)는
정확히 어떻게 동작하는지요?
그리고 위의 TList예는 어떻게 해결을 해야 하는지?
도움 부탁드립니다.
즐거운 하루 되세요.