본문 바로가기

CS 잡지식

상속(Inheritance)의 단점 ( 템플릿 메서드의 단점 )

자식 클래스에 "extends 부모 클래스명"의 형식으로 명식가 되어 있기 때문에, 강한 의존 관계 문제가 발생을 한다. 

이 유연하지 못한 의존 관계는 코드의 유지/보수에 심각한 문제를 초래한다.

 

1. 자식 클래스에서 필요로 하지 않는 필드/메서드도 상속을 받게 된다.

->  자식 클래스에서 꼭 부모 클래스의 모든 필드/메서드를 사용하지 x.

 

2. 부모 클래스의 코드 변경 시, 거기에 맞춰서 자식 클래스도 일일이 변경을 해줘야 할 수도 있다.

( 참고로, 여러 자바 코드를 봐왔지만, 상속을 사용하는 경우는 거의 보지 못하였다. 상속의 기능을 이용하고 싶을 때는 대

체로, 추상 클래스를 만들어 자식 클래스에서 구현해야 할 메서드를 명시해주거나, 인터페이스를 구현하는 방식으로 상속

의 기능을 구현하였다. )

 

3.템플릿 메서드와 같은 경우에는, 자식 객체를 별도로 선언을 해줘야 한다거나, 익명 클래스를 정의해줘야 하는 문제가 있다.

-> 코드가 더러워 진다. 

이러한 상속과 템플릿 메서드의 단점을 극복하고자 상속의 기능을 유지하면서 위 단점들을 해결해 주는 디자인 패턴으로 

전략 패턴(strategy pattern)이 있다. 

아래의 템플릿 메서드 코드를 참고해 보아라!

public abstract class AbstractTemplate<T> { 

    private final LogTrace trace;

    protected AbstractTemplate(LogTrace trace) {

        this.trace = trace;

    }

    public T execute(String message){

        TraceStatus status = null;

        try{

            status = trace.begin(message);

            // 비지니스 로직 호출 ( 변하는 부분 )
           T result = call();

            trace.end(status);
            return result;

        }catch(Exception e){

            trace.exception(status,new IllegalStateException("예외 발생!"));
            throw new IllegalStateException();
        }

    }

    // 자식 클래스에서 오버라이딩해야 함!!( 변하는 부분 )
    protected abstract T call();

 

@Slf4j
public class SubclassLogic1 extends AbstractTemplate { // 자식 클래스( SubclassLogic1 )은 부모 클래스( AbstractTemplate )을 매우 강하게 의존하고 있다.
                                                        // "의존한다"라는 말은 자식 클래스에서 부모 클래스 명을 명시하고 있다는 것이다. 
    @Override
    // 비지니스 로직 ( 변하는 부분 )
    protected void call() {

        log.info("비지니스 로직1 실행");

    }
}