SSAFY11th-book-study / book-study

SSAFY 11기 6반의 '토비의 스프링 스터디'
0 stars 0 forks source link

[1.2.3] 상속을 통한 확장의 단점 #1

Closed gmelon closed 7 months ago

gmelon commented 7 months ago

p.72 ~ p.73에서 상속을 통한 기능 확장의 단점에 대해 말하고 있습니다. 책에서는 단순히 상속을 통한 상하위 클래스의 관계는 생각보다 밀접하다 라고 이야기하고 넘어갔는데 구체적으로는 어떤 경우들이 있을지 궁금합니다!

제가 지금 생각했을 때 떠오르는 걸로는 아래와 같은 부모 클래스가 있고,

부모 클래스

public class Parent {
    protected List<String> list = new ArrayList<>();
}

아래와 같은 자식 클래스에서 부모의 멤버를 사용해서 무언가를 하고 있다고 했을 때

자식 클래스

public class Child extends Parent {
    public void doSomething() {
        list.add("블라블라");
    }
}

자식 클래스가 부모의 내부 구현에 의존하게 되는 상황이 되어 아래와 같이 부모 클래스가 변경되면 자식 클래스가 깨질 수 있다는 생각이 들었습니다.

public class Parent {
    protected String[] list = new String[10];
}

추가적으로, 개발을 하시며 상속을 통한 확장으로 인한 문제를 경험한 적이 있으시다면 공유해주시면 많은 공부가 될 것 같습니다 :)

limjongheok commented 7 months ago

제가 생각하기에는 상속을 통한 확장 문제로는 부모 클래스에 새로운 기능이 추가 될시 문제가 될 수 있다 생각합니다

public class Duck{
    public void swim(){
      System.out.println("수영 중");
    }
}

class ThunderDuck extends Duck{ //...}
class OrdinaryDuckextends Duck{ //...}
class DuckToy extends Duck{//..}

다음과 같이 부모 클래스로는 Duck 이 있고 자식 클래스로는 ThunderDuck, OrdinaryDuck, DuckToy 가 있을때 부모 클래스 Duck에서 자식클래스들의 공통 기능을 중복되지 않도록 사용하고 있습니다.

허나 만약 Duck 클래스에서 fly() 메소드를 넣고 싶을때

public class Duck{
    public void swim(){
      System.out.println("수영 중");
    }
    public void fly(){
       System.out.println("날다");
    }
}

이때 자식인 DuckToy 는 날다 기능이 추가 되는게 맞지 않다는 모순이 생깁니다. 그렇다고 fly() 메소드를 상속을 하지 않고 필요 클래스 OrdinaryDuck 과 ThunderDuck 에 넣는다 하면 중복코드가 발생하고 fly() 메소드 관련 클래스가 많아 질수록 문제가 발생합니다. 또한 Overrid 를 받아 DuckToy 가 fly() 를 null 한다 하는것도 DuckToy 처럼 fly() 메소드랑 관련이 없는 클래스가 많아지면 일일이 수정해야 된다라는 문제가 있을 겁니다. 제가 알기로는 이런 문제에 관한 디자인 패턴이 전략 패턴으로 알고있습니다. https://msyu1207.tistory.com/entry/1%EC%9E%A5-%ED%97%A4%EB%93%9C%ED%8D%BC%EC%8A%A4%ED%8A%B8-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%A0%84%EB%9E%B5-%ED%8C%A8%ED%84%B4 다음을 참고하면 좋을것 같습니다.