본문 바로가기
객체지향 설계5대 원칙/PYTHON

객체지향5대원칙-DIP(DIP-Dependency Inversion Principle) - 의존 역전 원칙

by 쁘락지 2023. 5. 25.
반응형
객체지향 5대원칙(SOILD)의 원칙중 D에 해당하는것으로 의존관계생성시
자주 변환하는것이 아닌 자주 변화하지 않는것에 의존성을 더 올려서
유지보수 능력을 올리기 위한 원칙이다.

그럼 예를들어보자
농부가 과수원에서 과일을 재배하는데 아래와 같다고 하자

class Apple:
    def Culture(self):
        print("사과를 재배합니다.")

class Orange:
    def Culture(self):
        print("오렌지를 재배합니다.")

class Farmer(Apple):
    def Culture(self):
        super().Culture()

if __name__ == "__main__":
    farmer = Farmer()
    farmer.Culture()

이런경우 농부가 재배하는 작물을 Orange로 바꾼다면 아래와 같이 수정해야 합니다.

class Apple:
    def Culture(self):
        print("사과를 재배합니다.")

class Orange:
    def Culture(self):
        print("오렌지를 재배합니다.")

class Farmer(Orange):
    def Culture(self):
        super().Culture()

if __name__ == "__main__":
    farmer = Farmer()
    farmer.Culture()


이렇게 Farmer가 뭘 재배하냐는 작물을 계속 상속 의존하게 되면 새로운 작물로 변경할때마다 지속적으로 Farmer클래스가 변경되야 합니다. 그래서
Farmer는 재배만 하고 뭘 재배할지는 외부에서 정의해서 준다면 이렇게 변경할수 있습니다.

from abc import ABC,abstractmethod
class Fruit(ABC):
    @abstractmethod
    def Culture(self):
        pass

class Apple(Fruit):
    def Culture(self):
        print("사과를 재배합니다.")

class Orange(Fruit):
    def Culture(self):
        print("오렌지를 재배합니다.")

class Farmer:
    def __init__(self, fruit: Fruit):
        self._fruit: Fruit = fruit
    def Culture(self):
        self._fruit.Culture()

if __name__ == "__main__":
    fruit: Fruit = Apple()
    farmer = Farmer(fruit)
    farmer.Culture()

여기서 Apple재배에서 Orange로 변경하게 되면 다음과 같이만 해주면 된다.
package kr.co.touch;

if __name__ == "__main__":
    fruit: Fruit = Orange()
    farmer = Farmer(fruit)
    farmer.Culture()
반응형