자바나 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가 발생한다.
이러한 상속을 소위 '깨지기 쉬운 상속'이라고 얘기할 수 있다.
구현 클래스를 이용해서 하는 코딩이라면 극단적으로 위와 같은 방식의 코딩도 가능하다는 얘기다.
따라서 상속을 이용하는 경우에는 하위에서 어떤 방식으로 오버라이딩이 되었는지 모르기 때문에 발생하는 문제가 더 크다는 얘기다.
댓글 없음:
댓글 쓰기