인터페이스 분리 원칙 (ISP, Interface Segregation Principle)
in Development on Design Pattern
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
- 한 번 읽으면 두 번 깨닫는 객체지향 프로그래밍(김동헌, e비즈북스)
- 인터페이스의 분리
- SOLID: Part 3 - Liskov Substitution & Interface Segregation Principles
- https://github.com/binghe819/TIL/blob/master/OOP/SOLID/ISP.md