편협한 생각으로서의 프로그래밍 다시 보기 - 3 programming

inheritance(상속이 뭐냐?)

당신의 퇴근시간을 획기적으로 압당길 수 있는 가장 좋은 방법이다.
잘만든 차의 프레임을 여러번 욹어먹을 수 있듯이
잘만든 클래스 하나는 두고두고 우려먹자고 생긴 개념 생각한다.

oop이전의 절차적 언어에서 많이 일어났던 문제로서 copy & paste가 있는데 이는 이전에 만든 프로젝트의 기능을 다음의 프로젝트에서 써먹기 위해 주로 사용되었다. 현재도... 여기서 생겨나는 문제로 아무리 좋은 코드라고 해도 해당 프로젝트에 맞춰서 설계되어 있기때문에 다른 프로젝트에서 사용하기 위해서는 약간의 수정은 필수이다.

하지만 시간과 프로그래머의 자질과 기타 외부 조건으로 인하여 코드에 대한 테스트 없이 사용할 경우 데드락과 메모리 오버플로우라(특히 C)는 재앙과 같은 일이 발생할 수 있다.

그렇다고 A = A + 1라는 것도 쓰기 싫어서 A++이라는 코드를 만들어낸 프로그래머로서는 코드의 재사용(솔직한 말로 배껴먹기)없이 현대의 프로그래밍을 한다는 것은 불가능한 일임으로 코드의 재사용성을 극대화하기 위하여 재사용해야만 하는 부분만을 모아서 클래스로 마치 자동차의 프레임 처럼 만든 후 두고 두고 욹어먹는 것을 상속이라 한다.

또 이렇게 할 경우 절차적 언어의 copy & paste의 side effect인 코드의 중복으로 인한 코드 수정상의 여기를 수정 하면 저기가 튀어나오는 등의 두더지게임 문제를 어느정도 해결할 수 있는 해결책이 됄 수 있다.

그럼 어떻게 해야 상속될 클래스를 잘 만들 수 있을까?

개인적으로 연관성, 가독성, 성능 그리고 안전성(신뢰성)이 가장 중요하다 할 수 있다.

연관성은 1편에서 설명했듯이 클래스는 서로 연관됀 기능끼리 묶어져 있어야 하며 쓸모 없는 내용이나 스페셜한 꼭 한번 쓸만한 기능을 삭제하도록 하는 것이 좋다. 두번째 가독성은 상속의 의미를 생각하면 (아니 클래스의 의미 자체를 생각하면) 다른 사람이나 자신이 다시 쓰도록 하는 것이 가장 중요한 것이라 할 수 있다.

클래스의 기능이 아무리 좋다고 하여도 클래스를 알아 처 먹을 수 있어야 쓸 수 있지 않겠는가. 그래서 가독성을 위한 네이밍이나 기타 주석이 아주 중요하다 할 수 있다.

성능의 측면에서, 일반적으로 잘 만들어진 클래스는 당연히 어느정도 성능이 뒷받쳐주기 때문에 쓰인다. 이 성능은 무조건 빠름을 이야기 하는 것이 아니다. 어느 특정 상황에서의 빠른 성능이 아닌 대부분의 상황에서 평균속도가 나오는 것이 가장 좋은 성능이라 할 수 있으며 하다 못해 일반적인 상황에서는 평균속도를 내주어야 한다.

마지막으로 안전성(신뢰성)이 또 중요한데, 상속되는 클래스는 몇번이 상속될지 아무도 모르는 일이다. 만약 안전성에 문제가 있는 클래스가 사용된다면 프로젝트에 끼치는 영향은 막대하다 할 수 있다. 하지만 이는 절차적 언어에 비교하면 코드의 중복이 거의 없음으로 root를 고침으로 대부분의 문제를 해결하는 효과를 누릴 수 있다.

이렇게 상속될 클래스를 만드는 일은 그리 쉬운 일이 아니며 생각해야 할 부분이 매우 많다. 그래서 일반적인 현장에서 삼진아웃을 많이 사용하는데 이는 처음 생성한 코드나 두번의 중복이 돼는 코드는 프로젝트 진행의 효율성을 위해 무시할 수 있지만 세번의 중복은 차후에도 사용될 수 있는 가능성이 높은 코드임으로 상속 클래스로 리빌드하는 방법이다.