본문 바로가기
TIL/잡학다식

[잡학다식] 의존관계 역전 원칙(DIP: Dependency Inversion Principle)

by 죠르띠에 2022. 7. 22.

객체지향 설계 5원칙

  • SRP(Single Responsibility Principle) - 단일 책임 원칙
  • OCP(Open-Closed Principle) - 개방-폐쇄 원칙
  • LSP(Liskov Substitution Principle) - 리스코프 치환 원칙
  • ISP(Interface Segregation Principle) - 인터페이스 분리 원칙
  • DIP(Dependency Inversion Principle) - 의존관계 역전 원칙

 

이번에 알아볼 것은 SOLID의 D인 DIP(Dependency Inversion Principle) - 의존관계 역전 원칙에 대해 알아볼 것이다.

 

 

상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다.
- WIKIPEDIA -

 

  • 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
  • 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.

 

DIP 예시

interface Switch {
  String turnOn();
  String turnOff();
}

class FanSwitch implements Switch {
  @Override
  String turnOn(){
    return "선풍기가 켜졌습니다."
  }
  
  @Override
  String turnOff(){
    return "선풍기가 꺼졌습니다."
  }
}

class AirconSwitch implements Switch {
  @Override
  String turnOn(){
    return "에어컨이 켜졌습니다."
  }
  
  @Override
  String turnOff(){
    return "에어컨이 꺼졌습니다."
  }
}

class PowerButton {
  private Switch switch;
  
  public setSwitch(Switch switch){
    this.switch = switch;
  }
  
  public String turnOn(){
    return switch.turnOn();
  }
  
  public String turnOff(){
    return switch.turnOff();
  }
}

class main {
  PowerButton powerButton = new PowerButton();
  Switch fanSwitch = new FanSwitch();
  Switch airconSwitch = new AirconSwitch();
  
  powerButton.setSwitch(fanSwitch);
  powerButton.turnOn();
  
  powerButton.setSwitch(airconSwitch);
  powerButton.turnOn();
}

역시 예시로 스위치를 가지고 왔다. 이번 예제는 조금 길다(코드블럭으로만 작성해서 테스트는 해보지 않았다).

상위 계층인 PowerButton을, 하위 계층인 FanSwitch와 AirconSwitch를 구성하였다.

이렇게 하면 상위계층은 하위 계층의 구현과 독립될 수 있다.

 

 

느낀점

예제를 만들면서도 아직은 이해가 부족하다고 생각이 든다.

많은 예제를 찾아봤지만 만들기 어려웠고 조금 보충이 필요하다고 느껴진다.

그리고 'DIP를 적용하여 설계를 할 수 있을까?'라는 생각이 든다.