정의
- 클라이언트 자신이 이용하지 않는 기능에는 영향을 받지 않아야 한다는 내용을 다루고 있음. 즉, 인터페이스를 클라이언트에 특화되도록 분리시키는 설계 원칙
ex) 복합기 (ISP 원칙 적용 전)
- 복합기 기능을 제공하는 클래스는 매우 비대해질 가능성이 큼
- 모든 기능을 클라이언트가 동시에 사용하는 경우가 거의 없음
- 필요에 따라 특정 기능만 이용
- 범용 인터페이스보다는 클라이언트에 특화된 인터페이스를 사용해야 함
ex) 복합기 (ISP 원칙 적용 후)
- 복합기를 사용하는 객체들마다 자신이 관심을 갖는 메서드들만 있는 인터페이스를 제공받도록 설계
- 인터페이스가 일종의 방화벽 역할을 수행함
- 클라이언트 자신이 사용하지 않는 메서드에 생긴 변화로 인한 영향을 받지 않게 됨
SRP와 ISP 사이의 관계
- 어떤 클래스가 단일 책임을 수행하지 않고 여러 책임을 수행하게 되면 방대한 메서드, 클래스, 인터페이스가 될 가능성이 커짐
-> 단일 책임을 갖는 여러 클래스로 분할SRP하고 각자의 인터페이스를 제공해야 함
Q. ISP는 SRP를 만족하면 성립되는가?
A. 반드시 그렇다고는 볼 수 없다. 게시판을 예로 들자면,
- 전제조건
- 여러 기능을 구현한 메서드를 제공하는 클래스가 있음
- 글쓰기, 읽기, 수정, 삭제를 위한 메서드가 제공됨
- 성립
- 일반 사용자는 게시판 삭제 기능 권한이 없음
- 관리자는 게시판 삭제 기능 권한이 있음
-> 게시판 클래스는 게시판에 관련된 책임을 수행하므로 SRP를 만족함
but. 클래스의 모든 메서드가 들어 있는 인터페이스가 클라이언트에 상관없이 사용된다면 ISP에 위배됨
Reference
- 정인상, 채흥석, 『JAVA 객체 지향 디자인 패턴』, 한빛미디어(2019.3.8), 124~127p