yoongrammer

인터페이스 분리 원칙 (ISP: Interface Segregation Principle) 본문

OOP

인터페이스 분리 원칙 (ISP: Interface Segregation Principle)

yoongrammer 2022. 5. 13. 16:47
728x90

목차

    인터페이스 분리 원칙 (ISP: Interface Segregation Principle)


    클라이언트는 사용하지 않는 인터페이스에 강제로 의존해서는 안된다.

    로버트 C. 마틴

     

    인터페이스 분리 원칙(ISP)은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙입니다.

    ISP를 지킴으로써 큰 덩어리의 인터페이스를 구체적이고 작은 단위로 분리시키며 클라이언트가 꼭 필요한 메서드만 이용할 수 있게 합니다.

    ISP 적용 전


    ISP를 위반하는 예를 보겠습니다.

    ISP 위반 예

    Vechicle은 go(), fly() 메서드를 가진 추상 클래스입니다.

    from abc import ABC, abstractmethod
    
    class Vehicle(ABC):
    	@abstractmethod
    	def go(self):
    		pass
    
    	@abstractmethod
    	def fly(self):
    		pass

     

    Aircraft 클래스는 Vehicle 클래스를 상속받습니다.

    class Aircraft(Vehicle):
    	def go(self):
    		print("Go")
    
    	def fly(self):
    		print("Fly")

     

    Car 클래스는 Vehicle 클래스를 상속받습니다. Car 클래스는 fly할 수 없기 때문에 fly() 메서드에서 예외를 발생시킵니다.

    class Car(Vehicle):
    	def go(self):
    		print("Go")
    
    	def fly(self):
    		raise Exception("can not fly")

    Car 클래스는 Vehicle 클래스를 상속받기 때문에 반드시 fly를 구현해야 합니다.

    하지만 Car class는 fly를 사용하지 않습니다. 이것은 ISP를 위반합니다.

    ISP 적용 후


    ISP 적용 후 모습은 다음과 같습니다.

    ISP 적용 후

    Vehicle 인터페이스를 Movable, Flyable 인터페이스로 나누고 Flyable 클래스에 Movable 클래스를 상속받도록 합니다.

    from abc import ABC, abstractmethod
    
    class Movable(ABC):
    	@abstractmethod
    	def go(self):
    		pass
    
    class Flyable(Movable):
    	@abstractmethod
    	def fly(self):
    		pass

     

    Aircraft 클래스가 Flyable 클래스를 상속받도록 합니다.

    class Aircraft(Flyable):
    	def go(self):
    		print("Go")
    
    	def fly(self):
    		print("Fly")

     

    Car 클래스는 Movable 클래스를 상속받도록 합니다.

    class Car(Movable):
    	def go(self):
    		print("Go")

    이렇게 되면 Car는 go() 메서드만 구현하면 되고 fly메서드는 구현할 필요가 없어 ISP를 만족하게 됩니다.

    결론


    ISP는 인터페이스가 응집력 측면에서 작게 분할하여 클래스가 필요한 작업만 실행하도록 하는 것을 목표로 합니다.

     

    ISP는 단일 책임 원칙(SRP)와 거의 비슷한 목표를 가지고 있습니다.

    둘의 차이점은 SRP는 클래스와 관련된 반면 ISP는 인터페이스와 관련되어 있다는 것입니다.

     

    클라이언트별로 세분화된 인터페이스를 만들고 클라이언트는 사용하지 않는 메서드를 구현하지 않도록 주의해야 합니다.

     

     

     

    728x90
    Comments