[자바] 상속과 구성
상속(Inheritance)
상속에는 몇가지 단점이 존재한다.
첫번째는 상위 클래스에 종속적이라는 것이다.
위의 두 사진을 보면, Ex01 클래스에서 똑같은 add()함수를 호출하였는데도, Ex01_01에서 기술된 add()의 내용이 다르기 때문에 결과가 다르게 나온다. 그렇기 때문에 하위클래스인 Ex01은 항상 원하는 결과를 얻기 위해서는 상위클래스인 Ex01_01의 변화를 항상 감지하고 그에 맞추어 진화를 해야한다.
두번째는 상위클래스에서 새로운 매소드를 추가할 때, 하위클래스에 같은 이름과 인자를 지녔지만 반환타입이 다른 경우 하위클래스에서 컴파일 오류가 발생할 수 있다.
위의 소스와 같이 하위클래스인 Ex01에서 기존에 minus라는 String타입의 매소드를 지니고 있었는데, 상위클래스에서 int타입의 minus매소드를 추가한다고 생각해보자.
위와 같이 반환타입의 충돌로 오류가 발생한다. 이와 같이 상위클래스의 새 매소드가 잘못된 오버라이딩을 초래할 수도 있다.
구성(Composition)
구성(Composition)은 이러한 문제점들을 보완해줄 수 있는 방법이다. 바로 상위클래스로 하려고 했던 기존 클래스의 인스턴스를 참조하는 private필드를 서브클래스로 하고자했던 클래스에 생성하는 것이다. 그리고 새로운 클래스의 각 인스턴스 매소드에서는 기존 클래스에 포함된 매소드를 호출하여 결과를 반환해 주는데, 이것을 포워딩(Forwording)이라고 한다.
그렇다면 구성의 단점은 무엇인가? 바로 객체 자신의 참조를 다른 객체에 전달하는 콜백 프레임워크에서의 사용이 부적절하다는 것이다. 포워딩이 적용된 클래스를 래퍼클래스(Wrapper Class)라고 하는데, 이런 래퍼 클래스에서 포함된 객체는 자신의 래퍼클래스를 알지 못하므로, 콜백을 할 경우 자신의 참조만을 다른 객체에 전달하기 때문이다.
요약
상속과 구성은 상호배타적인 관계가 아니라 이 둘을 같이 이용할줄 알아야 한다. 두 방법은 서로 유사한 점이 많으나, 사용해야할 때를 구분하자면 보통 IS A 관계와 HAS A관계로 구분한다. 이것은 예로 들자면 한 원에 대해 '원은 반지름을 가진 점이다.'와 '원은 반지름과 점을 가지고 있다.'로 구분할 수 있다. 이것의 자세한 설명은 아래 참조의 블로그들에 잘 되어있다.