쉅내용

imjingu·2023년 8월 26일
0

개발공부

목록 보기
412/481

상속 vs 구성
상속과 유사하지만 상속과는 미묘하게 다른 구성 composition이라는 기법이 있음
구성은 클래스가 다른 클래스의 인스턴스를 클래스의 필드로 가지는 디자인 기법 반면에 상속은 한객체가 클래스를 상속받아서 부모 객체의 속성과 동작을 휙득할 수 있는 기법
상속 및 구성은 객체지향 개발자가 사용하는 두가지의 중요한 프로그래밍 기술

상속은 한 클래스를 다른 클래스에서 파생시키는 반면 구성은 하나의 클래스를 다른 클래스의 합으로 정의

상속을 통해 생성된 클래스와 객체는 밀접하게 결합이 됨, 상속관계에서는 부모 클래스를 변경하면 코드가 손상될 위험이 있음 - 결합도가 높다

구성을 통해 생성된 클래스와 객체는 느슨하게 결합되어 코드를 손상시키지 않고 구성요소를 더 쉽게 변경할 수 있음 - 결합도가 낮다

느슨하게 결합된 코드가 더 많은 유연성을 제공하기 떄문에 많은 개발자들은 구성이 상속보다 더 나은 기술이라고 생각하기도 함 즉 결합도가 낮은게 더 좋다 생각함

상속
is - a 관계
상속에서는 하나의 클래스만 상속할 수 있으므로 하나의 클래스에서만 코드를 재사용
final로 선언된 캘르스의 코드를 재사용 할 수 없음

구성
구성은 has - a 관계
여러 클래스의 코드를 재사용할 수 있음
final로 선언된 클래스의 코드도 사용할 수 있음

is - a 관계
a는 b의 일종이다 라고 말하는 것과 같음
예를 들어 사과는 과일의 일종이고, 자동차는 차량의 일종 is - a 관계가 있으면 상속을 사용 상속은 단방향
객체지향 프로그래밍에서 자식 크랠스와 부모 클래스 사이에 is - a 관계가 있을 때 사용
따라서 상속의 계층 구조를 올바르게 설계하였는지를 알려면 is - a 관계가 성립하는지를 생각하면 됨

상속 사용을 고려할 떄는 항상 자식 클래스가 실제로 부모 클래스의 특수한 버전인지 자문하는 것이 좋음 이 경우 강아지는 동물의 특수한 버전이므로 상속 관계가 맞음
흔히 자바 입문자의 경우 의욕에 넘쳐서 모든것을 상속으로 해결할려고 함
하지만 상속을 사용하는 경우, 부모 클래스와 자식 클래스 사이에는 강한 연관관계 가 생김
이 경우 부모 클래스가 변경되면 자식 클래스들도 모두 영향을 받음
물론 is - a 관계가 있는 클래스인 경우에는 상속을 사용하는 것이 장점이 많고 자연스로운 방법
하지만 is - a 관계가 아닌데도 무분별하게 상속을 사용하면 단점이 더 많음

has - a 관계
만약 '~은 ~을 가지고 있다' 와 같은 has - a(포함) 관계가 성립되면 이 관계는 상속으로 모델링을 하면 안됨, 이 경우에는 구성을 사용

자동차는 엔진을 가지고 있다.
도서관은 책을 가지고 있다 (Library has a book)
집은 욕실을 가지고 있다

객체 지향 프로그래밍에서 has - a 관계는 구성(composition) 또는 집합 (aggregation)을 의미
구성에서는 하나의 객체가 다른 객체의 부품이 됨
집합관계에서는 하느이 객체가 다른 객체를 소유하게 됨

has - a 관계가 성립되는 경우에는 상속을 이용하는 것이 아니라 하나의 클래스 안에 다른 클래스의 객체를 포함시키면 됨
is - a 관계 못지않게 has - a 관계를 이용하는 것도 중요

package chapter20230825;

class Vehicle{}
class Engine {}
class Brake {}

public class Car extends Vehicle{
	private Engine e;
	private Brake b;
	public Car() {
		this.e = new Engine();
		this.b = new Brake();
	}

}

위의 코드는 아주 간단하지만 is - a 관계와 has - a 관계가 동시에 들어가 있음
vehicle 클래스와 Car 클래스의 관계는 is - a 관계
하지만 Car 클래스와 Engine 클래스의 관계는 has - a 관계

구성 vs 집합
구성과 집합은 객체의 생명주기에 약간의 차이가 있음

구성

Public class A {
	private B b = new B();
    
    public A() {}
{

클래스 A의 인스턴스에 대한 참조가 더이상 존재하지 않으면 해당 클래스의 인스턴스 B가 소멸, 이것이 구성. 부속품이기 때문에 A가 없어지면 B도 소멸
A안에서 B를 생성

집합의 간단한 예

public class A {
	private B b;
    
    public A(B b) {
    	this.b = b;
   }
}

클래스 A의 인스턴스에 대한 참조가 더이상 존재하지 않더라도 클래스 B의 인스턴스는 소멸되지 않음 그렇기 때문에 인스턴스를 재사용 할 수 있음
A안에서 new b를 안만들고 A밖에서 만듬

이들은 모두 객체지향 프로그래밍에 빈번하게 나타나는 패턴

상속 vs 구성
상속과 구성 중에서 선택할 떄는 다음과 같은 사항을 고려
상속에서는 메서드 오버라이딩 기능을 사용하여 부모 클래스의 메서드를 수정할 수 있음
상속은 내부 구조를 하위 클래스에 노출, 만약 구성을 사용하게 되면 객체는 캡슐화된 상태로 유지
구성이 더 간단한 경우가 많음
구성은 구현 독립성을 허용

0개의 댓글