JAVA

[JAVA] DIP (의존 관계 역전 원칙)

준몽쓰 2025. 4. 12. 23:46

■ DIP

구체화의 의존하지 말고 추상화(인터페이스, 추상 클래스)에 의존해야 한다.

 

예제)

● Car는 Engine을 사용해서 움직인다.

● 엔진 종류는 GasEngine, ElectricEngine이 있다.


■ DIP 위반 (엔진에 직접 의존)

class GasEngine {
    public void start() {
        System.out.println("휘발유 엔진 시동");
    }
}

class Car {
    private GasEngine engine = new GasEngine(); // 직접 생성 (구체 클래스에 의존)

    public void drive() {
        engine.start();
        System.out.println("차가 출발합니다!");
    }
}

1) GasEngine을 ElectricEngine으로 바꾸려면 Car 클래스를 고쳐야 한다.

2) 확장성 떨어진 코드

 

■ DIP 준수 (인터페이스에 의존)

interface Engine {    //1. 추상화 (인터페이스 정의)
    void start();
}


class GasEngine implements Engine { //2. 다양한 구현체 만들기
    public void start() {
        System.out.println("휘발유 엔진 시동");
    }
}

class ElectricEngine implements Engine {
    public void start() {
        System.out.println("전기 엔진 시동");
    }
}


class Car {                    //3. Car는 추상화(Engine)에 의존
    private Engine engine;

    // 생성자 주입 (DI)
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void drive() {
        engine.start();
        System.out.println("차가 출발합니다!");
    }
}




public class Main { 
    public static void main(String[] args) {
        Engine gas = new GasEngine();
        Car car1 = new Car(gas);
        car1.drive();

        Engine electric = new ElectricEngine();
        Car car2 = new Car(electric);
        car2.drive();
    }
}

 

● Car는 비즈니스 로직 담당

● GasEngine, ElectricEngine 구현체

● Engine 인터페이스이며 추상화

● Car는 Engine이라는 추상하에만 의존 (DIP 적용)