Liskov 치환 원칙

moon.kick·2025년 3월 7일

아래는 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)는 하위 클래스의 구체적인 구현에 의존하지 않고 동일한 방식으로 객체를 사용할 수 있습니다.

https://beststar-1.tistory.com/6

profile
@mgkick

0개의 댓글