상속과 합성

상속의 개념

- extends : 부모에서 선언 및 전의를 모두 마치며, 자식은 메서드 / 변수를 그대로 사용 가능한 형태
Java는 다중 상속을 지원하지 않는다.(부모가 2명 이상인것)
- impliments : interface구현. 부모 객체는 선언만 하며, 정의는 자식에서 오버라이딩 하여 사용하는 형태
다중 상속 처럼 여러개를 상속받을 수 있다.  
부모의 메서드를 사용하며, 동작이 의도대로 흘러가도록 강제할 수 있으나, 구현은 자식 클래스에서 하기때문에 결합도를 낮출 수 있다.
- abstract : extends와 impliments의 혼합. extends는 하되, 부모의 몇 개는 추상 메서드로 구현되어있는 형태

상속의 단점

  1. 상속은 부모 클래스의 내부 구현에 대해 상세히 알아야 하기 때문에, 자식과 부모 사이의 결합도가 높아질 수 밖에 없다.
  2. 또한, 부모의 쓸모없는 기능까지 모두 받게 될 가능성이 있다.
  3. 부모 클래스가 수정되면, 자식클래스도 동시에 수정해야하는 경우가 생긴다.
  4. 단일 상속만 가능하기 때문에, 결국 인터페이스를 또 사용하게 된다.

'합성' 이란?

  • 합성은 구현에 의존하지 않는 점에서 상속과 다르다.
    • 합성을 이용했을 때는, 객체의 내부는 공개되지 않고 인터페이스를 통해 코드를 재사용하기 때문에, 구현에 대한 의존성을 인터페이스에 대한 의존성으로 변경하여 결합도를 낮출 수 있다.
    • 합성 관계는 실행 시점에 동적으로 변경될수 있다.(런타임)
public class Phone {
    private RatePolicy ratePolicy; // 클래스 합성
    private List<Call> calls = new ArrayList<>(); // 클래스 합성

    public Phone(RatePolicy ratePolicy) {
        this.ratePolicy = ratePolicy;
    }

    public List<Call> getCalls() {
        return Collections.unmodifiableList(calls);
    }
}

결론은 다형성을 이용하고 싶을때, 부모클래스를 정확히 이해하고 그대로 계승할것이 아니라면, extends 대신 impliments를 사용하여 결합도를 낮추는 것이 좋고, 그 외 모든 경우네는 합성을 이용하도록 권고하고있다.