034_상속과 구성

Dec 26, 2023
034_상속과 구성

구성

  • 클래스가 다른 클래스의 인스턴스를 클래스의 필드로 가지는 기법이다.
  • 하나의 클래스를 다른 클래스의 합으로 정의한다.

상속과 구성의 차이

상속
구성
상속은 “is-a” 관계이다.
구성은 “has-a” 관계이다.
상속에서는 하나의 클래스만 상속할 수 있으므로 하나의 클래스에서만 코드를 재사용할 수 있다.
여러 클래스에서 코드를 재사용할 수 있다.
상속은 컴파일 시간에 결정된다.
구성은 실행 시간에 결정될 수 있다.
final로 선언된 클래스의 코드를 재사용할 수 없다.
final로 선언된 클래스에서도 코드를 재사용이 가능하다.
부모 클래스의 public 및 protected 메소드를 모두 노출한다.
아무것도 노출되지 않는다. 공개 인터페이스만을 사용하여 상호 작용한다

is-a 관계

  • A는 B의 일종이다.
  • 상속을 사용한다.
  • 상속은 단방향이다.

has-a 관계

  • ~은 ~을 가지고 있다.
  • 구성을 사용한다.
  • 하나의 클래스 안에 다른 클래스의 객체를 포함 시키는 형태이다.
  • 구성 또는 집합을 의미한다.

구성 VS 집합

  • 구성 : House에는 하나 이상의 Room이 있다. 이것은 구성이다. Room은 House 없이는 존재하지 않으므로 Room의 수명은 House에 의해 제어된다.
  • 집합 : Block을 모아서 ToyHouse를 만들 수 있다. 이것은 집합이다. ToyHouse가 분해되더라도 Block들은 남는다.
구성 간단 코드
public class A { private B b = new B(); public A() { } }
집합 간단 코드
public class A { private B b; public A( B b ) { this.b = b; } }

상속 VS 구성

  • 상속에서는 메서드 오버라이딩 기능을 사용하여 부모 클래스의 메서드를 수정할 수 있다.
  • 상속은 내부 구조를 하위 클래스에 노출한다. 만약 구성을 사용하게 되면 객체는 캡슐화된 상태로 유지된다.
  • 구성이 더 간단한 경우가 많다.
  • 구성은 구현 독립성을 허용한다.
Share article
RSSPowered by inblog