인터페이스 분리 원칙(ISP)이란?
인터페이스 분리 원칙은 객체 지향 설계의 SOLID 원칙 중 네 번째 원칙이다. 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다는 원칙이다. 즉, 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다는 의미이다.
잘못된 예제부터 봅시다.
protocol Worker {
func work()
func eat()
}
class HumanWorker: Worker {
func work() {
print("Human working")
}
func eat() {
print("Human eating")
}
}
class RobotWorker: Worker {
func work() {
print("Robot working")
}
func eat() {
// 로봇은 먹지 않음
}
}
RobotWorker는 eat 메서드를 구현할 필요가 없지만, 인터페이스에 의해 강제된다.
다음은 올바른 예제이다.
protocol Workable {
func work()
}
protocol Eatable {
func eat()
}
class HumanWorker: Workable, Eatable {
func work() {
print("Human working")
}
func eat() {
print("Human eating")
}
}
class RobotWorker: Workable {
func work() {
print("Robot working")
}
}
이 예제에서는 인터페이스를 분리하여 RobotWorker가 Eatable 인터페이스에 의존하지 않도록 했다.
ISP를 준수함으로써 얻을 수 있는 장점
- 단일 책임: 인터페이스를 작고 구체적으로 유지하여 클래스가 불필요한 기능을 가지지 않게 한다.
- 높은 응집도: 관련된 메서드들만 묶여있어 코드의 응집도가 높아진다.
- 낮은 결합도: 클래스가 자신이 사용하지 않는 메서드에 의존하지 않으므로 결합도가 낮아진다.