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

ISP란 무엇인가

  • 인터페이스는 ‘그 인터페이스를 사용하는 클라이언트’를 기준으로 분리해야 한다. 즉, 클라이언트 입장에서 사용하는 기능만 제공하도록 인터페이스를 분리해야 한다. 이로써 한 기능에 대한 변경의 여파를 최소화할 수 있게 된다.
  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
  • 인터페이스를 분리하게 되면 인터페이스가 명확해지고, 대체 가능성이 높아진다.

예시

  • 자동차 인터페이스 → 운전 인터페이스, 정비 인터페이스로 분리

    이렇게 분리함으로써 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음.

  • 사용자 클라이언트 → 운전자 클라이언트, 정비사 클라이언트로 분리

ISP 예시

ISP를 적용하기 전

// ISP를 적용하지 않은 예제
public interface multifunction {
  void copy();
  void fax(Address from, Address to);
  void print();
}
public class CopyMachine implements multifunction {
  @Override
  public void copy() {
    System.out.println("### 복사 ###");
  }

  @Override
  public void fax(Address from, Address to) {
    // 사용하지 않는 인터페이스가 변경되어도 함께 수정이 일어난다.
  }

  @Override
  public print() {
    // 사용하지 않는 인터페이스가 변경되어도 함께 수정이 일어난다.
  }
}
  • multifunction 인터페이스에 모든 기능들을 한 번에 넣었더니, CopyMachine을 구현하는데 필요없는 fax(), print()도 모두 구현해줘야 한다.
  • 만약 multinfunction 인터페이스에서 fax()나 print()에 대해서 리턴 타입이 변경된다면, 이와 전혀 상관없는 CopyMachine 클래스도 같이 수정해줘야 하는 문제가 발생한다.

ISP를 적용한 이후

// ISP가 적용된 예제
public interface Print{
  void print();
}

public interface Copy {
  void copy();
}

public interface Fax {
  void fax(Address from, Address to);
}
public class copyMachine implements Copy {
  @Override
  void copy() {
    System.out.println("### 복사 ###");
  }
}

예시

인터페이스의 분리 - 머루의개발블로그

References