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