구성
- 클래스가 다른 클래스의 인스턴스를 클래스의 필드로 가지는 기법이다.
- 하나의 클래스를 다른 클래스의 합으로 정의한다.
상속과 구성의 차이
상속 | 구성 |
상속은 “is-a” 관계이다. | 구성은 “has-a” 관계이다. |
상속에서는 하나의 클래스만 상속할 수 있으므로 하나의 클래스에서만 코드를 재사용할 수 있다. | 여러 클래스에서 코드를 재사용할 수 있다. |
상속은 컴파일 시간에 결정된다. | 구성은 실행 시간에 결정될 수 있다. |
final로 선언된 클래스의 코드를 재사용할 수 없다. | final로 선언된 클래스에서도 코드를 재사용이 가능하다. |
부모 클래스의 public 및 protected 메소드를 모두 노출한다. | 아무것도 노출되지 않는다. 공개 인터페이스만을 사용하여 상호 작용한다 |
구성 VS 집합
- 구성 : House에는 하나 이상의 Room이 있다. 이것은 구성이다. Room은 House 없이는 존재하지 않으므로 Room의 수명은 House에 의해 제어된다.
- 집합 : Block을 모아서 ToyHouse를 만들 수 있다. 이것은 집합이다. ToyHouse가 분해되더라도 Block들은 남는다.
구성 간단 코드
public class A { private B b = new B(); public A() { } }
집합 간단 코드
public class A { private B b; public A( B b ) { this.b = b; } }
상속 VS 구성
- 상속에서는 메서드 오버라이딩 기능을 사용하여 부모 클래스의 메서드를 수정할 수 있다.
- 상속은 내부 구조를 하위 클래스에 노출한다. 만약 구성을 사용하게 되면 객체는 캡슐화된 상태로 유지된다.
- 구성이 더 간단한 경우가 많다.
- 구성은 구현 독립성을 허용한다.
Share article