ISP(Interface Segregation Principle)
ISP?
ISP는 인터페이스 분리 원칙(Interface Segregation Principle)의 약자로 객체는 자신이 사용하는 메서드에만 의존해야 한다는 뜻이다.
즉 인터페이스는 지나치게 광범위 하거나 많은 기능을 구현해서는 안되고, 각 인터페이스는 해당 인터페이스를 사용하는 객체를 기준으로 잘게 분리되어야 한다는 의미이다.
예제
package SOLID;
abstract class Transportation{
void boarding() {
System.out.println("탑승합니다");
}
// Car
abstract void drive() ;
abstract void leftDrive() ;
abstract void rightDrive();
// Ship
abstract void steer();
abstract void steerLeft() ;
abstract void steerRight() ;
}
class Car extends Transportation{
// Car
void drive() {
System.out.println("운전합니다");
}
void leftDrive() {
System.out.println("왼쪽으로 운전합니다");
}
void rightDrive() {
System.out.println("오른쪽으로 운전합니다");
}
// Ship
void steer() {
System.out.println("조종합니다");
}
void steerLeft() {
System.out.println("왼쪽으로 조종합니다");
}
void steerRight() {
System.out.println("오른쪽으로 조종합니다");
}
}
문제
Car 객체에선 배를 조종할 떄 필요한 steer, steerLeft, steerRight 가 전혀 필요하지 않음에도,
Transportation 클래스를 상속받았기 때문에 다 구현해야 함.
만약 일반 메서드 상속이었던 경우에도 불필요한 메서드들을 강제로 상속받게 되는 것.
이는 부모 객체의 규모카 커질 수록 개발의 편의성을 저하시키는데,
필요하지도 않은 수십개의 메서드를 일일히 오버라이딩해 적절히 처리해야하기 때문이다.
해결
각각의 기능을 인터페이스로 분리해 다중 상속을 통해 각 객체가 자신에게 필요한 기능만을 가지도록 제한한다.
public interface boarding {
public void boarding();
}
public interface drive {
public void dive();
}
public interface driveLeft {
public void driveLeft();
}
public interface driveRight {
public void driveRight();
}
public interface steer {
public void steer();
}
public interface steerLeft {
public void steerLeft();
}
public interface steerRight {
public void steerRight();
}
public class Car implements boarding,drive,driveLeft,driveRight{
@Override
public void boarding() {
// 구현...
}
@Override
public void dive() {
System.out.println("운전합니다.");
}
@Override
public void driveLeft() {
System.out.println("왼쪽으로 운전합니다.");
}
@Override
public void driveRight() {
System.out.println("오른쪽으로 운전합니다.");
}
}
결론
클래스 내의 모든 메서드를 인터페이스 단위로 분리하는 것은 실제로 쉽지 않으며 비효율적이다.
그러나 적어도, 특정 객체가 사용하는 메서드들을 단위로 인터페이스를 분리해놓으면
(Car interface, Sheep interface )
불필요한 상속, 구현을 피할 수 있다.
참고 사이트
[OOP] 객체지향 5대 원칙(SOLID) - 인터페이스 분리 원칙 (ISP) (velog.io)
댓글남기기