JAVA

합성

diligentdev 2024. 1. 20. 10:24
728x90

상속의 단점

  • 결합도가 높아짐
  • 불필요한 기능까지도 상속받음
  • 부모 클래스 결함이 그대로 넘어 옴
  • 부모와 자식 동시에 수정해야 함
  • 불필요한 인터페이스 상속 문제
    • 자식 클래스에서 부적합한 부모 클래스의 메소드가 상속되어 자식 클래스의 인스턴스 상태가 불안정해짐
  • 단일 상속의 한계
    • java에서는 다중 상속이 불가능해 이미 다른 클래스를 상속 중이라면 또 다른 클래스를 상속받을 수 없다
  • 현업에서는 가능하면 extends를 지양하는 편
  • 상속을 사용할 때에는 정말 개념적으로 연관 관계가 있을 때만 함

합성이란?

부모(?) 클래스의 기능이 필요하면, 따로 클래스 인스턴스 변수에 저장하여 가져다 쓴다

필드의 인스턴스를 참조해 사용하는 메소드를 포워드 메소딩이라고 한다

 

기본 예제

class Car {
	Engine engine // 필드로 Engine 클래스 변수를 갖는 다 (has)

	Car(Engine engine) {
		this.engine = engine; //생성자 초기화 시 클래스 필드의 값을 정하게 됨
	}

	void drive() {
		System.out.println("%s엔진으로 드라이브~\n", engine.EngineType);
	}
}

class Engine {
	String EngineType; //디젤, 가솔린, 전기

	Engine(String type) {
		EngineType = type;
	}
}

public class Main {
	public static void main(String[] args) {
		Car digelCar = new Car(new Engine("디젤"));
		digelCar.drive(); // 디젤엔진으로 드라이브~

		Car electroCar =new Car(new Engine("전기"));
		electroCar.drive(); //전기 엔진으로 드라이브~
	}
}

Car 클래스에서 Engine 클래스 인스턴스 변수를 가져다가 사용 

 

상속과 합성의 차이점

  • 상속
    • 부모클래스와 자식클래스 사이의 의존성은 컴파일 타임에 해결
    • 부모클래스의 구현에 의존 결합도가 높음
    • is-a 관계
  • 합성
    • 부모클래스와 자식클래스 사이의 의존성은 런타임에 해결
    • 부모클래스의 구현에 의존하지 않음
    • 인터페이스에 의존
    • has a 관계

합성의 단점

  • 클래스 간의 관계를 파악하는 데 시간이 걸림
  • 코드가 복잡해 질 수 있음
728x90