JAVA

[JAVA] 상속 / 컴포지션

집한구석 2021. 5. 15. 20:39
728x90

상속

  • 부모클래스에서 정의된 필드와 메소드를 자식이 물려받는 것 
  • 자식클래스에서 extends를 선언하여 상속을 받을 수 있으며, 부모클래스는 하나만 정의가 가능
  • 객체지향프로그래밍의 특징인 캡슐화를 깨뜨림, 부모클래스의 정의가 변경되면, 하위클래스도 변경하기 때문
  • 캡슐화를 깨뜨리는 단점때문에 왠만한 상황에서는 컴포지션으로 푸는 것이 좋음 (오류낼 가능성 있음)

컴포지션

  • private 필드를 통하여 기존의 클래스가 새로운 클래스의 구성요소(인스턴스로)로 쓰이는 것 
  • 새로운 클래스에 기존 클래스의 영향이 적어, 기존 클래스가 변경되어도 안전함 (변화에 유연함)

예시

/* 부모클래스 */
public class Notebook {

  public void on() {
    System.out.println("전원동작");
  }
}

/* 자식클래스 / 기존클래스 */
public class Macbook extends Notebook {

  private final Keyboard checker;

  /* 새로운 클래스를 기존클래스에 인스턴스 변수를 추가하여 사용 */
  public Macbook(Keyboard checker) {
    this.checker = checker;
  }

}

/* 컴포지션으로 사용할 클래스 */
public class Keyboard {

  public void keyStroke() {
    System.out.println("키입력");
  }
}

결론

  • 상속을 사용하는 경우는 명확하게 기능이 정의된 경우, Is-a 관계가 완벽할 때 사용함
  • 위와 같은 상황이 아닌 경우 Has-a 관계인 컴포지션으로 문제를 해결하는 것이 좋음

'JAVA' 카테고리의 다른 글

[JAVA] 상태패턴  (0) 2021.05.21
[JAVA] Builder 패턴  (0) 2021.05.16
[JAVA] static 정리  (0) 2021.05.15
[JAVA] 초기화 순서  (0) 2021.05.12
[JAVA] Lombok @Delegate  (0) 2021.04.18