Agile Java 스터디에서 상속에 대한 논의가 시작되었습니다. 논의는 처음 상속이 필요한가? 아니면 지양해야 하는가? 이렇게 시작을 하려했지만 이미 그러한 논의는 옛날 부터 있었던 것이고 Object-Based가 아닌 Object-Oriented에서는 상속이 특징으로 꼽히기 때문에 굳이 유용한 기능을 지양할 필요는 없다고 생각합니다. API에서도 이미 상속을 사용하여 많은 클래스들을 구현해 놓았고 다형성은 어떻게 할 것이며 제네릭 같은 템플릿은 상속이 없으면 과연 존재 의미가 있기나 한건지 생각하게 됩니다. 아 다시 생각해보니 제네릭과 상속은 별 상관이 없겠네요. 콜렉션의 타입을 제약하는 기능을 하는거기 때문에 하지만 역시 다형성을 사용못한다는 건 큰 손실이라고 생각이 됩니다.

Situation

그래서 인지 아닌지 논의의 초점은 바뀌었습니다. Abstract 클래스만을 상속하도록 제한되어야 하는가? 아니면 어떤 클래스든 상속을 자유롭게 사용해야 하는가?로  바뀌었습니다. 이 둘중에 어느 한쪽 만을 굳이 선택해야 한다면 전 자유로운 상속을 택하겠습니다. 둘의 가장 큰 차이는 상위 타입의 객체를 만들 수 있느냐 없느냐인 것 같은데 물론 경우에 따라서 상위 타입의 객체 생성을 자제 해야하는 경우도 있겠지만 Abstract 클래스만 상속하도록 제한한다면 개발이 형식에 얽매여서 필요없는 일까지 하게될 상황이 발생하게 될 수 있다는 생각을 해봅니다.

Abstact 클래스만 상속하도록 바껴야 한다. 라는 규율? 규칙이 있는 환경에서 개발을 한다고 생각해보면 다음과 같은 클래스 구조가 생길 것입니다.
1136697125.bmp어디선가는 객체를 써야 하기 때문에 결국 클래스를 만들게 되겠지요. 이렇게 시스템을 만들어 둔 상태에서 새로운 요구사항이 생겨서 정삼각형, 직각 삼각형 등을 추가하게 됐다면 어떻게 고쳐야 할까요?

상속을 자유롭게 사용하자

1143458043.bmp당연히 이렇게 되어야 한다고 생각합니다. 기존에 Triangle 객체를 사용하던 사람들도 여전히 사용할 수 있고 새로 추가된 RegularTriangle과 RightTriangle 객체도 사용할 수 있게됐으니 말이죠.

Abstract 클래스만 상속해야 한다.

하지만 Abstract 클래스만 상속 받아야 한다면 어떻게 해야할까요?
1143637301.bmp이렇게 하지 않을까요? 이렇게 하면 기존의 Triangle에 있던 멤버들과 중복이 발생하게 되는 것 아닐까요? 아니면 다음과 같이 기존의 Triangle 클래스를 Abstract로 바꿀수도 있습니다.(주로 성일이형이 말씀하시던게 바로 이 그림이 아닐런지 생각해 봅니다.)
1344920669.bmp이렇게 되면 Triangle에 있는 자원을 재사용 할 수 있게 되어 괜찮지 않을까 생각할 수 있지만 기존에 Triangle 클래스를 사용하던 소스코드들은 그럼 전부 어떻게 되는거죠? 따라서 Abstract 클래스만 상속을 하도록 제약하는 것은 개발을 너무 힘들게 하는 일이라고 생각합니다.