영호
[SOLID] ISP(인터페이스 분리 원칙) 본문
ISP(인터페이스 분리 원칙)이란
"클라이언트는 자신이 사용하지 않는 기능에 의존하게 해선 안된다." 즉, 모든 클라리언트를 위한 범용적인 인터페이스 보단, 특정 클라이언트에 맞게 여러 인터페이스로 분리하는 것이 좋다는 뜻입니다.
SRP와 비슷한 맥락입니다. SRP는 각 클래스들이 하나의 책임을 가지게 해서 유지보수성을 높였다면, ISP는 인터페이스들이 단일 책임을 가지도록 하는 원칙입니다.
예시
자동차를 개발하기 위해 Car인터페이스를 만들었습니다. 그런데 자동차에는 수동, 자동 2종류가 있다고 가정합니다. Car라는 범용적인 인터페이스를 사용하게 된다면, autoHandle(), manualHandle() 이렇게 2가지의 메서드가 포함되어야 할 것입니다.
이제 해당 인터페이스를 구현하는 클래스를 생각해보면 수동 조작하는 클래스는 autoHandle메서드를 사용하지 않지만 Car인터페이스를 구현해야 하기 때문에 autoHandle에 의존하게 됩니다. 반대의 경우도 마찬가지입니다. 이는 "클라이언트는 자신이 사용하지 않는 기능에 의존하게 해선 안된다."라는 ISP원칙에 위배됩니다.
그래서 범용적인 Car인터페이스가 아닌 AutoCar, ManualCar 같이 인터페이스를 분리할 필요가 있습니다. 이를 코드를 통해 추가적으로 살펴보겠습니다.
Code
package isp;
public interface Car {
void handleAuto();
void handleManual();
}
package isp;
public class Truck implements Car{
@Override
public void handleAuto() {
System.out.println("auto car 조작합니다.");
}
@Override
public void handleManual() {
System.out.println("수동으로 조작합니다.");
}
}
- 이처럼 범용적인 Car인터페이스로 인해 Truck 클래스에서 오토차량과 관련 있는 handelAuto메서드까지 의존하게 됩니다.
- 이로 인해, AutoCar와 전혀 상관없는 handelAuto()에 변화가 생긴다면 Truck까지 영향이 미치게 됩니다.
ISP준수를 위한 인터페이스 분리
package isp;
public interface ManualCar {
void handleManual();
}
package isp;
public class Truck implements ManualCar{
@Override
public void handleManual() {
System.out.println("수동으로 조작합니다.");
}
}
- 이제 Truck클래스는 수동 차량 관련 인터페이스인 ManualCar에 의존하면서 Truck이 사용하지 않는 메서드에 의존하기 않게 되면서 ISP원칙을 지키게 됐습니다.
- 이로 인해 앞으로의 유지보수성이 향상됐습니다.
'OOP' 카테고리의 다른 글
다형성이란? (4) | 2023.03.11 |
---|---|
[OOP] SOLID - DIP(의존성 역전 원칙) (2) | 2022.12.23 |
[OOP] SOLID - LSP(리스코프 치환 원칙) (0) | 2022.06.05 |
[OOP] SOLID - OCP(개방-폐쇄 원칙) (0) | 2022.05.25 |
[OOP] SOLID - SRP(단일책임원칙) (0) | 2022.05.23 |
Comments