우리는 보통 계층도를 작성할때 큰 뼈대를 이루고 있는 Root 클래스와 그 Root 클래스를 상속받은 하위 클래스들로 작성을 한다. 그리고 공통적인 부분에 대한 기본적인 가상함수를 작성하고 일반적인 행위는 이 공통적인 가상함수를 호출하며 특수한 클래스의 경우 이 가상함수를 오버라이딩해서 작성한다. 나도 지금까지 이런방식으로 했다.
하지만 분명 공통적인 부분에 대한 행위를 하지 않는 클래스 임에도 불구하고 가상함수를 오버라이딩하는 부분을 깜빡했다면 어떠한가? 물론 런타임시 해당 객체가 올바른 동작을 하지 않을것이다. 이렇게만 된다면 버그를 일찍발견하고 수정이 가능할것이다. 허나 Root의 가상함수를 사용하여도 버그가 나타나지 않고 미묘한 결과차이가 난다면 그리고 이 결과값을 체크하지 않는다면 어떻게 되겠는가? 버그를 포함한 프로그램이 탄생이 될것이다. 물론 사용자들에게서 프로그램이 이상하다는 피드백을 받을것이다. 그제서야 “왜 그렇지?” 하면서 소스를 볼것이고 그때 발견하게 될것이다. (해당 모듈의 개발자가 아니라면 시간이 더 오래걸릴것이다. 이 객체가 Root의 가상함수를 사용하는게 당연한것으로 알고있기때문에.)
이런 부분에 대해서 한가지 팁을 말해주고싶다. Root의 가상함수를 순수 가상함수로 만들며Root의 가상함수가 행했던 일을 Root의 일반 멤버 함수로 만드는것이다. Root를 상속받은 객체 마다 가상함수를 다시 재정의 하고 해당 함수가 하는일을 Root의 일반멤버함수를 호출하는것으로 하는것이다. 물론 가상함수를 다시 재정의 하는 불편함이야 있겠지만. 특별한 행위를 요하는 클래스가 잘못된 행동을 하는 부분을 막을수 있지 않을까?
