[java] Composition

happiyoung_·2024년 8월 9일

java

목록 보기
4/9

is-a 와 has-a

is-a

is-a 는 상속에 기반한 것으로, 클래스의 상속과 인터페이스의 상속이 있다.

implementsextends 를 사용하면 클래스 상속이 가능해진다. 클래스 상속을 하게 되면 양방향의 경우가 아니라 상하관계가 생긴다.

예를 들어, 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

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이 바로 여기 관계에 해당한다.

Comparision

  • 클래스 변경에 있어서는 composition이 더 쉽다.
  • Composition은 동적 바인딩에 해당하며, Inheritance는 정적 바인딩에 해당한다.
  • 단순히 코드 재사용성과 다형성만을 구현하고자 한다면 Inheritance보다 Composition을 사용한다.

Composition

컴포지션은 private로 객체를 데려와 인스턴스로 참조하는 형태로 다른 객체를 포함하고자 할때 사용하며, 이때 다른 객체에 완전히 의존한다.

위의 예시에서 살펴보면, 컴포지션 관계인 Dayoung 과 Organ의 경우 Dayoung 클래스가 사라지면 Organ클래스도 존재할 수 없다.

장점

  • 컴포지션은 코드를 재사용가능하게 해준다.
  • 자바에서, 다수의 상속을 사용할 수 있게 한다.
  • 더나은 클래스의 실험가능성을 제공한다.
  • 쉽게 개선된 버전이 되도록 허용한다.
  • 동적으로 프로그램의 동작을 변경하도록 허용한다. (런타임 시에 결정)
profile
해삐한 다영의 컴퓨터와 친해지기 프로젝트 🥰

0개의 댓글