Clients should not be forced to depend upon interfaces that they do not use.
클라이언트(기능을 사용하는 클래스)는 사용하지 않는 인터페이스(+ 기능, 메소드 등)에 의존하면 안된다.
《Agile Software Development, Principles, Patterns, and Practices》
Martin, Robert C. (2002).

다음과 같은 클래스 있다고 생각해보자.

public class 스마트폰 {
    public void 전화걸기(){}
    public void 문자보내기(){}
    public void 유튜브보기(){}
    public void 사진찍기(){}
    ...
}

스마트폰은 많은 기능을 제공한다.
하지만 모든 클라이언트가 이 기능들을 전부 이용하지는 않을 수 있다.
사진찍기()만 이용하고 싶은 클라이언트가 있고, 전화걸기()만 사용하려는 클라이언트가 있다.
한 클래스에서 여러 기능들을 제공해준다면 그 기능들은 연관되어있을 가능성이 높다.
그러므로 한 기능의 변경이 다른 기능에 영향을 미칠 가능성도 높아진다.
클라이언트 자신이 이용하는 기능 이외의 다른 기능의 변경에 의한 영향을 받지 않아야 한다.
사진찍기()만 이용하려는 클라이언트는 전화걸기 () 기능의 변경에 영향을 받지 않아야한다.
여러 클래스들이 한 인터페이스의 부분집합들만을 이용한다면 인터페이스를 분리해 클라이언트가 기대하는 메시지만을 전달해야한다.

위의 클래스는 다음의 인터페이스들로 변경할 수 있다.

public interface 전화기 {
    public void 전화걸기();
}

public interface 카메라 {
    public void 사진찍기();
}

...

SRP가 클래스의 단일책임을 강조한다면 ISP는 인터페이스의 단일책임을 강조한다. 하지만 ISP는 어떤 클래스 혹은 인터페이스가 여러 책임 혹은 역할을 갖는 것을 인정한다. 이러한 경우 ISP가 사용되는데 SRP가 클래스 분리를 통해 변화에의 적응성을 획득하는 반면, ISP에서는 인터페이스 분리를 통해 같은 목표에 도달 한다.

  • 적용방법

    • 클래스 인터페이스를 통한 분리

      클래스의 상속을 이용하여 인터페이스를 나눌 수 있다.
      이와 같은 구조는 클라이언트에게 변화를 주지 않을 뿐 아니라 인터페이스를 분리하는
      효과를 갖는다.
      하지만 거의 모든 객체지향 언어에서는 상속을 이용한 확장은 상속받는 클래스의 성격을 디자인 시점에 규정한다.
      따라서 인터페이스를 상속받는 순간 인터페이스에 예속되어 제공하는 서비스의 성격이 제한 된다.

    • 객체 인터페이스를 통한 분리

      위임(Delegation)을 이용하여 인터페이스를 나눌 수 있다.
      위임이란, 특정 일의 책임을 다른 클래스나 메소드에 맡기는 것이다.
      만약 다른 클래스의 기능을 사용해야 하지만 그 기능을 변경하고 싶지 않다면, 상속 대신 위임을 사용 한다.

참고

SOLID Design Principles Explained: Interface Segregation with Code Examples
OOD - 변화로 부터의 보호 , Protected Variation
객체지향 개발 5대 원리: SOLID
SOLID (5) - 인터페이스 분리 원칙, ISP