아래는 PHP 코드를 자바(Java) 언어로 변환한 예시입니다. 각 클래스는 Vehicle을 상속받아 기능을 확장하며, Driver 클래스는 Liskov 치환 원칙(Liskov Substitution Principle)을 적용하여 Vehicle의 하위 클래스(Car, ElectricBus) 모두를 문제없이 사용할 수 있음을 보여줍니다.
/**
* 기본 차량 클래스로, 엔진 시동 및 가속 기능을 제공합니다.
*/
public class Vehicle {
/**
* 엔진 시동 기능 (기본 동작)
*/
public void startEngine() {
// Default engine start functionality
}
/**
* 가속 기능 (기본 동작)
*/
public void accelerate() {
// Default acceleration functionality
}
}
/**
* Car 클래스는 Vehicle을 확장하여 엔진 시동 시 추가 절차(점화)를 수행합니다.
*/
public class Car extends Vehicle {
/**
* 엔진 시동 전 점화 절차를 실행한 후 기본 엔진 시동 기능을 호출합니다.
*/
@Override
public void startEngine() {
engageIgnition();
super.startEngine();
}
/**
* 점화 절차 (Car에 특화된 기능)
*/
private void engageIgnition() {
// Ignition procedure
}
}
/**
* ElectricBus 클래스는 Vehicle을 확장하여 가속 시 전기적 로직을 수행합니다.
*/
public class ElectricBus extends Vehicle {
/**
* 기본 가속 기능 대신 전기 버스에 맞는 가속 로직을 실행합니다.
*/
@Override
public void accelerate() {
increaseVoltage();
connectIndividualEngines();
}
/**
* 전압 증가 로직 (전기 버스에 특화된 기능)
*/
private void increaseVoltage() {
// Electric logic
}
/**
* 개별 엔진 연결 로직 (전기 버스에 특화된 기능)
*/
private void connectIndividualEngines() {
// Connection logic
}
}
/**
* Driver 클래스는 Vehicle 타입의 객체를 받아 엔진 시동과 가속을 실행합니다.
* 이를 통해 Liskov 치환 원칙에 따라 Vehicle의 모든 하위 클래스(Car, ElectricBus)가 동일하게 사용될 수 있음을 보장합니다.
*/
public class Driver {
/**
* 전달받은 차량(Vehicle)의 엔진을 시동하고 가속 기능을 실행합니다.
*
* @param vehicle 사용될 차량 객체 (Vehicle 또는 그 하위 클래스)
*/
public void go(Vehicle vehicle) {
vehicle.startEngine();
vehicle.accelerate();
}
// 간단한 테스트를 위한 main 메서드 (필요에 따라 사용)
public static void main(String[] args) {
Driver driver = new Driver();
// Car 테스트
Vehicle car = new Car();
driver.go(car);
// ElectricBus 테스트
Vehicle bus = new ElectricBus();
driver.go(bus);
}
}
참고:
Driver 클래스는 Vehicle 타입의 매개변수를 사용하므로, Car와 ElectricBus 모두 Vehicle을 상속받아 치환할 수 있습니다. 이는 Liskov 치환 원칙을 준수하는 설계 예시로, 클라이언트(Driver)는 하위 클래스의 구체적인 구현에 의존하지 않고 동일한 방식으로 객체를 사용할 수 있습니다.