의존성 역전 원칙(Dependency Inversion Principle, DIP)은 고수준 모듈이 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다는 원칙입니다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있습니다.
아래 코드는 고수준 모듈이 저수준 모듈에 직접 의존하는 예제입니다.
public class Light {
public void turnOn() {
System.out.println("Light is turned on");
}
public void turnOff() {
System.out.println("Light is turned off");
}
}
public class Switch {
private Light light;
public Switch(Light light) {
this.light = light;
}
public void turnOn() {
light.turnOn();
}
public void turnOff() {
light.turnOff();
}
public static void main(String[] args) {
Light light = new Light();
Switch lightSwitch = new Switch(light);
lightSwitch.turnOn();
lightSwitch.turnOff();
}
}
위 코드에서 Switch 클래스는 Light 클래스에 직접 의존하고 있습니다. 만약 다른 종류의 장치를 제어해야 한다면 Switch 클래스를 수정해야 합니다.
DIP를 적용하기 위해 인터페이스를 사용하여 고수준 모듈과 저수준 모듈이 추상화에 의존하도록 합니다.
public interface Switchable {
void turnOn();
void turnOff();
}
public class Light implements Switchable {
@Override
public void turnOn() {
System.out.println("Light is turned on");
}
@Override
public void turnOff() {
System.out.println("Light is turned off");
}
}
public class Fan implements Switchable {
@Override
public void turnOn() {
System.out.println("Fan is turned on");
}
@Override
public void turnOff() {
System.out.println("Fan is turned off");
}
}
public class Switch {
private Switchable device;
public Switch(Switchable device) {
this.device = device;
}
public void turnOn() {
device.turnOn();
}
public void turnOff() {
device.turnOff();
}
public static void main(String[] args) {
Switchable light = new Light();
Switch lightSwitch = new Switch(light);
lightSwitch.turnOn();
lightSwitch.turnOff();
Switchable fan = new Fan();
Switch fanSwitch = new Switch(fan);
fanSwitch.turnOn();
fanSwitch.turnOff();
}
}
의존성 역전 원칙을 준수하면 코드의 유연성과 재사용성이 크게 향상됩니다. 고수준 모듈과 저수준 모듈이 추상화에 의존하도록 설계하면, 변경에 유연하고 유지보수가 용이한 코드를 작성할 수 있습니다. 따라서 소프트웨어 개발에서 DIP를 준수하는 것이 중요합니다.