본문 바로가기
백수/java

16. 상속과 컴포지션(합성)의 차이에 대해서 설명해보세요

728x90
반응형

16. 상속과 컴포지션(합성)의 차이에 대해서 설명해 보세요

상속

ls-a 관계

부모 클래스에 중복 로직을 구현해 두고 이를 자식 클래스에서 코드를 재사용하는 방법입니다.

엄밀히 말하면 상속은 그저 코드 재사용을 위한 기법은 아닙니다.

일반적인 클래스가 이미 구현이 되어 있는 상태에서 그보다 좀 더 구체적인 클래스를 구현하기 위해 사용되는 기법이며 그로 인해 상위 클래스의 코드를 하위 클래스가 재사용할 수 있을 뿐입니다.

명확한 is-a 관계에 있는 경우, 상위 클래스가 확장할 목적으로 설계되었다고 문서화도 잘되어 있는 경우 사용하면 좋습니다.

상속은 수평이 아닌 수직 관계입니다.

//부모클래스
public class NoteBook{
	String strOn = "전원을 킨다.";
	public void on() {
		log.info(strOn);
	}
}
//class  자식 클래스  extends  부모 클래스
public class MacBook extends NoteBook{

	String strOff= "전원을 끈다.";

	// 새로운 클래스를 기존 클래스에 인스턴스 변수를 추가하여 사용
	public void MacBook(Keyboard check) {
		log.info(strOn()); // 부모 클래스
		log.info(strOff);// 자식 클래스
	}
}

 

합성

Has-a 관계

기존 클래스 상속을 통한 확장하는 대신 필드로 클래스의 인스턴스를 참조하게 만드는 설계입니다.

합성은 객체 간의 관계가 수직이 아닌 수평 관계입니다.

CellPhone 클래스가 Purchase 클래스의 기능이 필요하다고 해서 상속하지 말고 따로 클래스 인스턴스 변수에 저장하여 가져다 쓴 방식을 포워딩이라 합니다.

필드의 인스턴스를 참조해 사용하는 메서드를 포워딩 메서드라 부릅니다.

class CellPhone{
	// 필드로 Purchase 클래스 변수를 갖는다.
	Purchase purchase;

	CellPhone (Purchase purchase){
		// 생성자 초기화 할때 클래스 필드의 값을 정하게 됨
		this.cellPhone= cellPhone;
	}

	void CellPhoneState(){
		log.info("% 구매중 " , purchase.EngineType);
	}
}

class Purchase {
	String PurchaseType; // 휴대폰 타입

	Purchase (String type){
		PurchaseType= type;
	}
}

------------------------------------------------
public class Main {
	public static void main(String[] args){
		CellPhone samsung= new CellPhone(new Purchase("삼성"));
		samsung.CellPhoneState(); // 삼성 구매중

		CellPhone iPhone= new CellPhone(new Purchase("아이폰"));
		iPhone.CellPhoneState(); // 아이폰 구매중
	}
}

 

상속보다 합성을 사용해야 하는 이유

  • 캡슐화가 깨지고 결합도가 높아짐
    • 컴파일 시점에 관계가 결정되어 결합도가 높아집니다.
    • 컴파일 시점에 결정되는 관계는 유연성을 상당히 떨어뜨리고 실행 시점에 객체의 종류를 변경하는 것이 불가능하여 유기적인 다형성, 객체 지향 기술을 사용할 수 없습니다.
  • 유연성 및 확장성이 떨어짐
    • 부모 클래스 구현이 변경되는 경우 자식 클래스에도 변경이 필요합니다.
    • 자식 클래스마다 메서드의 구현이 달라져야 하는 경우 범위가 커집니다.
  • 다중상속에 의한 문제가 발생할 수 있음
    • 자바는 단일 상속만 허용하고 상속이 필요한 해당 클래스가 다른 클래스를 상속 중인 경우 문제가 발생됩니다.
  • 클래스 폭발 문제 발생 가능
    • 필요 이상으로 많은 수의 클래스를 추가해야 하는 클래스 폭팔 문제가 발생됩니다.
    • 자식 클래스가 부모 클래스의 구현과 강하게 결합되도록 강요하는 상속의 근본적인 한계 때문에 발생됩니다.
    • 자식 클래스와 부모 클래스 조합이 필요한 상화에서 유일한 해결 방법은 조합의 수만큼 새로운 클래스를 추가하는 것뿐입니다.
728x90
반응형