상위클래스의 변경이 어렵다.
상위클래스를 변경하게되면 그에 해당하는 하위클래스 모두에게 영향을 줄 수 있다. 상위클래스 입장에서 앞으로 어떤 하위클래스가 생길지 모르기 때문에 쉽게 변경하기 어렵다.
클래스가 증가할 수 있다.
상속 오용
// 예시 코드
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()
도 함께 상속받고, 사용가능하기 때문에 put
과 add
이 의미상 같기 때문에 오용할 수 있다. 오용한 사람보다 Container
클래스를 오용하게끔 설계한 사람에게 더 잘못이 있다.여러객체
를 묶어서 더 복잡한 기능을 제공
보통필드
로 다른 객체를 참조하는 방식으로 조립
또는 객체
를 필요시점에 생성
이전코드에서 ArrayList<Luggage>
를 상속을 받아서 사용하고있는데 이 클래스는 Container
클래스에서만 사용되어야하기 때문에 상속하지않고, 필드생성으로 재사용을 한다.
상속하기에 앞서 조립으로 풀 수 없는지 검토를 먼저 해볼 것.
진짜 하위타입인 경우에만 상속을 사용한다.
inflearn 객체 지향 프로그래밍 입문 강의를 보고 작성한 글입니다.
잘보고가용