인터페이스 격리 원칙 (Interface Segregation Principle; ISP)

클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다.

비대한 클래스(fat class)를 본적이 있는가? 비대한 클래스란 메서드를 몇십 몇백개 가지는 클래스를 가리키는 말이다. 대게 시스템 안에 이런 클래스를 두고 싶어하지 않지만, 가끔 피할 수 없는 경우도 있다.

불행히도 '호출하지도 않는' 메서드에 생기는 변경에 시스템은 영향을 받는다..

만약 아래와 같은 강좌 등록 시스템이 있을때, StudentEnrollment (학생 등록)라는 클래스를 사용하는 두 클라이언트가 있다. EnrollmentReportGenerator(등록 상황 보고서 생성자)가 prepareInvoice나 postPaymant 같은 메서드를 사용하지 않으리라는 것은 분명하다. 마찬가지로 AccountsReceivable (받을 수 있는 계좌) 역시 getName이랑 getDate 같은 메서드를 호출하지 않는 다고 가정해보자.

이제 요구사항이 변해서, postPayment 메서드에 새 인자가 추가되거나 할 경우 StudentEnrollment 의 선언을 바꾸는 변경 때문에 EnrollmentReportGenerator도 다시 컴파일하고 배포해야 하는 상황이 생길수도 있다. postPayment 메서드와는 아무 상관이 없는데도 말이다.

이를 아래와 같이 딱 필요한 메서드만 있는 인터페이를 분리하여 제공함으로써 필요하지 않는 메서드로부터 보호할수 있다. 각자가 관심있는(필요한) 메서드들만 있는 인터페이스를 제공받는다. 이렇게 하면 관심없는 메서드로부터 갱신 변경으로부터 시스템을 보호할 수 있다