ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SOLID] 인터페이스 분리 원칙이란 (Interface Segregation Principle, ISP)
    공부 2021. 8. 29. 18:21

    인터페이스 분리 원칙은 인터페이스를 사용하는 클라이언트 기준으로 분리해야 되는 원칙입니다. 다시 말해서, 클라이언트(자신)이 사용하지 않는 메소드와는 의존 관계를 가지면 안됩니다. 사용하지 않는 인터페이스의 메소드 때문에 영향을 받아 구현을 하면 안되고 영향을 받는다면 인터페이스를 나눠야 하는 원칙입니다.

    아래와 같은 예시 코드가 있다고 가정합니다.

    from abc import ABCMeta, abstractmethod
    
    class Vehicle(metaclass=ABCMeta):
        @abstractmethod
        def drive(self):
            pass
    
        @abstractmethod
        def fly(self):
            pass
    
        @abstractmethod
        def ride(self):
            pass
    
    class Car(Vehicle):
        def drive(self):
            print('차를 운전한다.')
    
        def fly(self):
            pass
    
        def ride(self):
            pass
    
    class Flight(Vehicle):
        def drive(self):
            pass
    
        def fly(self):
            print('비행기가 난다.')
    
        def ride(self):
            pass
    
    class Bicycle(Vehicle):
        def drive(self):
            pass
    
        def fly(self):
            pass
    
        def ride(self):
            print('자전거를 탄다.')

    운송수단이라는 추상 클래스로 Vehicle 클래스를 만든 다음, Car, Flight, Bicycle 클래스가 상속받아 해당되는 메소드를 구현한 예시입니다. 자바의 경우, 반환 타입이 변경된다면 이에 상관없는 Car와 Bicycle 클래스도 수정을 해야 합니다.

    인터페이스 분리 원칙을 적용하면 클라이언트가 사용하지 않는 메소드가 존재하면 인터페이스를 분리하는 것이 좋으므로 다음과 같이 해결할 수 있습니다.

    from abc import ABCMeta, abstractmethod
    
    class AbstractCar(metaclass=ABCMeta):
        @abstractmethod
        def drive(self):
            pass
    
    class AbstractFlight(metaclass=ABCMeta):
        @abstractmethod
        def fly(self):
            pass
    
    class AbstractBicycle(metaclass=ABCMeta):
        @abstractmethod
        def ride(self):
            pass
    
    class Car(AbstractCar):
        def drive(self):
            print('차를 운전한다.')
    
    class Flight(AbstractFlight):
        def fly(self):
            print('비행기가 난다.')
    
    class Bicycle(AbstractBicycle):
        def ride(self):
            print('자전거를 탄다.')

    이러한 형태는 파이썬의 믹스인 기법과 유사하게 보입니다.

    댓글