1. 상속과 재사용

1.1 상속을 통한 재사용 단점

  • 상위클래스의 변경이 어렵다.

    상위클래스를 변경하게되면 그에 해당하는 하위클래스 모두에게 영향을 줄 수 있다. 상위클래스 입장에서 앞으로 어떤 하위클래스가 생길지 모르기 때문에 쉽게 변경하기 어렵다.

  • 클래스가 증가할 수 있다.

  • 상속 오용

    // 예시 코드
    public class Container extends ArrayList<Luggage> {
      private int maxSize;
      private int currentSize;
    
      public Container(int maxSize) {
          this.maxSize = maxSize;
      }
    
      public void put(Luggage lug) throws NotEnoughSpaceException{
          if(!canContain(lug)){
              throw new NotEnoughSpaceException();
          } 
          super.add(lug);
          currentSize += lug.size();
      }
      public void extract(Luggage lug) {
          super.remove(lug);
          this.currentSize -= lug.size();
      }
      public boolean canContain(Luggage lug) {
          return maxSize >= currentSize + lug.size();
      }
    }
  • 이러한 경우에 put() 메소드를 사용해야 Luggage사이즈를 변경할 수 있는데 Container 클래스를 상속받아서 사용하는 입장에서는 ArrayList클래스의 add()도 함께 상속받고, 사용가능하기 때문에 putadd이 의미상 같기 때문에 오용할 수 있다. 오용한 사람보다 Container클래스를 오용하게끔 설계한 사람에게 더 잘못이 있다.

1.2 상속의 단점 해결방법

1.2.1 조립

  • 여러객체를 묶어서 더 복잡한 기능을 제공

  • 보통필드로 다른 객체를 참조하는 방식으로 조립 또는 객체를 필요시점에 생성

1.2.2 조립을 통한 기능 재사용

  • 이전코드에서 ArrayList<Luggage>를 상속을 받아서 사용하고있는데 이 클래스는 Container클래스에서만 사용되어야하기 때문에 상속하지않고, 필드생성으로 재사용을 한다.

  • 상속하기에 앞서 조립으로 풀 수 없는지 검토를 먼저 해볼 것.

  • 진짜 하위타입인 경우에만 상속을 사용한다.


  • 객체지향적 사고를 제대로 갖추기 위해서 기초적인 것부터 하나씩 다시 공부하고있는데 개념으로는 알겠는데 막상 코드로 직접 설계하고, 구현해보려고하니 한계가 있었다. 잘 짜여진 코드를 많이보고 연구해보아야 할 것 같다.