🔹 상속(Inheritance)이란?
🔹 구성(Composition)이란?
자동차(Car) 클래스 예시를 들어볼게요.
✅ 상속을 사용한 경우
// 부모 클래스
class Engine {
void start() {
System.out.println("엔진 시동!");
}
}
// 상속을 이용한 Car 클래스
class Car extends Engine {
void drive() {
start(); // Engine 클래스 메서드 사용
System.out.println("운전 시작!");
}
}
문제점
✅ 구성(composition)을 사용한 경우
// 인터페이스를 통해 느슨한 결합 관계 정의
interface Engine {
void start();
}
// 엔진 구현체
class GasEngine implements Engine {
public void start() {
System.out.println("가솔린 엔진 시동!");
}
}
class ElectricEngine implements Engine {
public void start() {
System.out.println("전기 엔진 시동!");
}
}
// 구성(Composition)을 이용한 Car 클래스
class Car {
private Engine engine;
// 생성자 주입을 통한 Composition
Car(Engine engine) {
this.engine = engine;
}
void drive() {
engine.start();
System.out.println("운전 시작!");
}
}
장점
// 유연한 변경 예시
Car gasCar = new Car(new GasEngine());
gasCar.drive();
// 출력:
// 가솔린 엔진 시동!
// 운전 시작!
Car electricCar = new Car(new ElectricEngine());
electricCar.drive();
// 출력:
// 전기 엔진 시동!
// 운전 시작!

자바 개발자뿐만 아니라 대부분의 개발자들은 상속보다 구성을 많이 사용하게 되는데,
이유는 느슨한 결합으로 인해 유연하고, 유지보수하기 쉽고, 확장성과 변경에 용이한 설계가 가능하기 때문입니다.