본문 바로가기

분류없음

왜 클래스 상속을 하는 걸까?

내가 만드는 프로젝트들은 상속에 상속을 자주 하곤 한다.

리펙토링을 하다가 보면, 왜 이렇게 짰지 할 정도로 상속하는 경우가 있다.

되돌려서 생각해보면 상속하게 되는 조건은 다음과 같다.


1. 반복적으로 작성된 코드의 Generaiize - 일반화 구성

  프로그램을 짤 때 제일 중요하게 여기는 부분은 같은 코드 또 안짜기다.

  똑같이 동작하는 코드들이 산재되어 있을 때를 바라보면, 각 클래스들은 무언가 공통적인 부분이 존재한다.

  그런 경우 해당 클래스들의 역할과 내용을 보고 비슷한 애들끼리 다시 묶는다.

  묶어주는 상위 클래스에서 공통적인 코드들을 제공한다.

  물론 static 클래스와 같이 Util 을 제공하는 방법도 있지만,

  나름 멤버 변수등을 통해서 데이터를 유지하면서 공통적인 코드를 실행하는 방법은

  역시 일반화 구성을 통해 상위 클래스로 묶는 방법이다.


2. Polimophism - 다형성 구성

   프로그램을 짜다가 보면, 미묘하게 if ~ else 혹은 switch ~ case 문을 이용하여

   내부 구조를 짜는 경우가 있다. 그런데 가만히 보면 한정적인 부분에 사용되는게 아니라,

   클래스 전반적으로 이 같이 짜는 경우가 있다.

   A 라는 클래스를 만들었는데, Start와 Stop이라는 메소드가 있다.

   그런데 내부 설정에 Type이라는 것을 만들어 Type 별로 Start와 Stop의 동작이 구분되는 경우가 있다.

   이를 구현할 때, Start 안에 switch case로 Stop안에 switch case로 구현하여 제공한다.

   사람마다 관점이 다르긴 한데, 하나의 파일에 하나의 소스 안에 모든 내용이 들어 있어

   관리하기 편하다고 하긴 하는데, 이러면 코드가 엄청 길어지는 모습을 보게 된다.

   필자는 이 경우 차라리 switch case 문으로 갈릴 바에는, 각 switch case에 대응되는 클래스들을 만들고

   그 클래스를 대표하는 상위 클래스로 만든 뒤, abstract 혹은 virtual을 통해 나누어 구현한다.

   switch 기준이 되는 Type이 1, 2, 3, 4 가 있다면, 차라리 c1, c2, c3, c4 라는 클래스를 만들고,

   cbase 라는 클래스를 상속하게 한다. 이렇게 하면, 외부에서는 cbase라는 클래스만 가지고 start, stop을 하면,

   c1으로 new해서 만들면, c1에 대한 start, stop이 불리고, c2를 new해서 만들면 c2에 대한 start, stop만 불리게 된다.


상속이라는게 디버깅하다가 보면 매우 까다롭기도 하고, 왠지 프로그램 전체에 대한 이해가 떨어지면 매우

복잡해 보인다는 문제가 있다. 하지만, 한번 잘 정리가 되면 이 보다 강력한 무기가 있을까?

코드들이 알아서 실행되고, 나뉘고 분리되고, 잘만 짜면 재활용도 가능하게 된다.


아직은 더 배우고 실험해볼 구석도 많긴 하지만 아직은 재미 넘치는 분야인듯 싶다.