2011년 1월 12일 수요일

상속은 위험하다(1)

자바나 C#등 모든 OOP에서 모든 개발자들이 가장 쉽게 접근하여 사용할 수 있는 개념은 바로 상속이다.

상속은 쉬울뿐 아니라 강력한 기능을 가지고 있다는 데에는 의견이 없다.

하지만 이러한 구현 클래스에 의한 상속은?

-----------------------------------------------------------------------------
public class PClass {
 
 
 private PClass target;
 
 public void setTarget(PClass target){
  this.target = target;
 }
 
 public void doA(){
  target.doA();
 }
}

-----------------------------------------------------------------------------

public class SClass extends PClass {
 
 public void init(){
  super.setTarget(this);
 }
 public void doA(){
  System.out.println("sub....");
  super.doA();
 }
 
 
 public static void main(String[] args) {
  
  SClass s = new SClass();
  s.init();
  s.doA();
  
 }
}
-----------------------------------------------------------------------------

위의 소스를 보자.
물론 예제를 만들기 위한 편협한 소스이지만 분명한 건 컴파일 시에는 위의 코드는 문제가 없다.

만일 당신이 이 소스의 문제가 클래스라고 말한다면 어쩔 수 없다. 반쯤은 동의할 의향이 있기 때문에..
하지만 좀 더 생각해 보면 상속이라는 구조가 성립되지 않는다면 위의 소스는 컴파일 자체가 불가능하다는 사실을 인정하기 바란다.

실행결과는 명확하다. StackOverflow가 발생한다.

이러한 상속을 소위 '깨지기 쉬운 상속'이라고 얘기할 수 있다.


구현 클래스를 이용해서 하는 코딩이라면 극단적으로 위와 같은 방식의 코딩도 가능하다는 얘기다.
따라서 상속을 이용하는 경우에는 하위에서 어떤 방식으로 오버라이딩이 되었는지 모르기 때문에 발생하는 문제가 더 크다는 얘기다.

댓글 없음:

댓글 쓰기