메인 메서드

public class Main {
    public static void main(String[] args) {
        // 일반 엔진과 자동차 조합
        Engine basicEngine = new Engine(150);
        Car basicCar = new Car(basicEngine);
        basicCar.startCar(); // 출력: 🚗 150 마력으로 출발!

        // 터보 엔진과 자동차 조합
        Engine turboEngine = new TurboEngine(150, 50);
        Car turboCar = new Car(turboEngine);
        turboCar.startCar(); // 출력: 🏎️ 터보 출력 포함 200 마력으로 출발!
    }
}

자동차 클래스 (생성자로 엔진을 주입받아 조합하는 방식)

public class Car {
    private Engine engine;

    // 생성자 주입 방식으로 엔진을 주입
    // 어떤 엔진이든 엔진을 상속받는 타입이라면 조립이 가능!
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void startCar() {
        engine.start();
    }
}

엔진 클래스(부모 클래스)

public class Engine {
    private int horsePower;

    public Engine(int horsePower) {
        this.horsePower = horsePower;
    }

    public void start() {
        System.out.println("🚗 " + horsePower + " 마력으로 출발!");
    }

    protected int getHorsePower() {
        return horsePower;
    }
}

터보 엔진 클래스(엔진을 상속받은 자식 클래스)

public class TurboEngine extends Engine {
    private int turboBoost;

    public TurboEngine(int horsePower, int turboBoost) {
        super(horsePower);
        this.turboBoost = turboBoost;
    }

    @Override
    public void start() {
        System.out.println("🏎️ 터보 출력 포함 " + (getHorsePower() + turboBoost) + " 마력으로 출발!");
    }
}