6.6 상속 vs 구성
•구성
: 다른 클래스의 인스턴스를 클래스의 필드로 가지는 디자인 기법.
1) has-a 관계
2) 여러 클래스에서 코드를 재사용 가능
3) 실행 시간에 결정될 수 있음
4) final로 선언된 클래스에서도 코드 재사용이 가능
5) 아무것도 노출되지 않으며, 공개 인터페이스만을 사용하여 상호작용한다.
•상속
: 한 객체가 클래스를 상속받아서 부모 객체의 속성과 동작을 획득할 수 있는 기법.
1) is-a 관계
2) 하나의 클래스에서만 코드 재사용 가능
3) 컴파일 시간에 결정됨
4) 종단 클래스의 코드 재사용 불가
5) 부모 클래스의 public 및 protected 메소드를 모두 노출
is-a 관계
-A는 B의 일종이다.
-상속(단방향)
has-a 관계
-~은 ~을 가지고 있다.
-구성 or 집합
ex) 자동차는 엔진을 가지고 있다.
ex) 도서관은 책을 가지고 있다.
< 구성 vs 집합 >
•구성 : House에는 하나 이상의 룸이 있다. Room은
House 없이는 존재하지 않으므로 Room의 수명은 House에 의해 제어된다.
•집합 : Block을 모아서 ToyHouse를 만들 수 있다.
ToyHouse가 분해되더라도 Block들은 남는다.
// 구성의 코드 표현
public class A {
private B b = new B();
public A() { }
}
B객체가 A 클래스 내부에서 직접적으로 생성되어
A객체 생성 시 B객체도 자동으로 생성되도록 함.
A 객체가 생성되면 항상 새로운 B 객체도 함께 생성됨.
=> A 클래스는 B 객체를 내부적으로 지니고 있다.
// 집합의 코드 표현
public class A {
private B b; // 생성자에 매개 변수를 넣기 위해 선언.
public A( B b ) { this.b = b; }
}
A 객체가 B 객체를 생성하는 것이 아니라, 외부(바깥 클래스 B)에서 이미 존재하는 B 객체를 A 객체에 전달하는 방식.