[JAVA] 상속 / 컴포지션

2021. 5. 15. 20:39·JAVA
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
'JAVA' 카테고리의 다른 글
  • [JAVA] 상태패턴
  • [JAVA] Builder 패턴
  • [JAVA] static 정리
  • [JAVA] 초기화 순서
집한구석
집한구석
  • 집한구석
    tgyun615.info
  • 전체
    오늘
    어제
    • 카테고리 (183)
      • JAVA (38)
      • SPRING (15)
      • KOTLIN (23)
      • NETTY (1)
      • DEVOPS (3)
      • DOCKER (7)
      • KUBERNETES (2)
      • JAVASCRIPT (1)
      • SPLUNK (3)
      • ELK (7)
      • KAFKA (2)
      • GO (4)
      • ALGORITHM & DATA STRUCTURE (9)
      • IDE (5)
      • OS (16)
      • NETWORK (14)
      • GCP (2)
      • AWS (2)
      • DATABASE (10)
      • CLEANCODE (7)
      • OTHER (12)
  • 최근 글

  • 태그

    cleancode
    엘라스틱서치
    splunk
    SQL
    docker
    클린코드
    코틀린
    이펙티브 코틀린
    AWS
    go
    자바
    이펙티브코틀린
    프로그래머스
    java
    IntelliJ
    JPA
    ElasticSearch
    Elk
    Kafka
    Spring
  • 링크

    • github
    • linkedin
    • resume
  • hELLO· Designed By 정상우. v4.10.3
집한구석
[JAVA] 상속 / 컴포지션
상단으로

티스토리툴바