is-a 는 상속에 기반한 것으로, 클래스의 상속과 인터페이스의 상속이 있다.
implements 나 extends 를 사용하면 클래스 상속이 가능해진다. 클래스 상속을 하게 되면 양방향의 경우가 아니라 상하관계가 생긴다.
예를 들어, Human을 상속받은 Dayoung 클래스를 생각해보자.
Dayoung은 Human이다는 성립하지만 Human은 Dayoung이다는 성립하지 않는다.
class Human {
private ear;
private foot;
public void static args[] eat();
public void static args[] walk();
}
class Dayoung extends Human {
private glasses;
private appliances;
public void static args[] jump();
public void static args[] happy();
}
이렇게 상속관계가 명확한경우 is-a relationship 이다.
has-a는 다른 객체의 레퍼런스인 인스턴스 변수의 경우 이다.
예를 들어, Human을 상속받은 Dayoung 클래스 내부에서 Organ클래스를 쓰려고 한다면 이 관계는 has-a relationship 이다.
class Dayoung {
private glasses;
private appliances;
Organ dayoungsOrgan;
public void static args[] jump();
public void static args[] happy();
}
class Organ {
private legs;
private head;
private fingers;
}
여기서 다루려고 하는 Composition이 바로 여기 관계에 해당한다.
composition이 더 쉽다.Composition은 동적 바인딩에 해당하며, Inheritance는 정적 바인딩에 해당한다.Inheritance보다 Composition을 사용한다.컴포지션은 private로 객체를 데려와 인스턴스로 참조하는 형태로 다른 객체를 포함하고자 할때 사용하며, 이때 다른 객체에 완전히 의존한다.
위의 예시에서 살펴보면, 컴포지션 관계인 Dayoung 과 Organ의 경우 Dayoung 클래스가 사라지면 Organ클래스도 존재할 수 없다.