자식 클래스에 "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 실행");
}
}
'CS 잡지식' 카테고리의 다른 글
Sub Class vs Interface implementation Class (0) | 2023.02.20 |
---|---|
템플릿 메서드 패턴의 단점을 극복하자 - Strategy Pattern (0) | 2023.02.20 |
Util Class - 여러 클래스에서 공통적으로 사용되는 기능!! (0) | 2023.02.20 |
객체의 속성 값(필드값)을 변경 시 주의해야 할 사항~~~!!! (0) | 2023.02.20 |
멀티 쓰레딩 상황에서 생길 수 있는 심각한 동시성(Concurrency issue)에 대한 고찰!! ( 면접에서 매우 고급 문제로서 잘 나옴 ) (0) | 2023.02.20 |