서론
이번 글에서는 저번 글에서 정리한 리스코프의 법칙에 이어 SOLID에서 I에 속하는 ISP에 대해 정리해보겠습니다.
객체지향 설계 5대 원칙
- SRP(Single Responsibility Principle): 단일 책임 원칙
- OCP(Open Closed Priciple): 개방 폐쇄 원칙
- LSP(Liskov Substitution Priciple): 리스코프 치환 원칙
- ISP(Interface Segregation Principle): 인터페이스 분리 원칙
- DIP(Dependency Inversion Principle): 의존 역전 원칙
ISP(Interface Segregation Principle) - 인터페이스 분리 원칙이란?
이 원칙의 개념은 쉽게 이해하기 위해서는 이름 그대로 인터페이스를 분리하는 원칙이라 이해하는 것이 좋을 것 같고 정의된 내용은 아래와 같다.
"클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다."
이 말이 지금은 쉽게 와닿지 않을 수 있다.
조금 더 내용을 풀어서 써보면,
특정 객체(클래스)에 대한 책임을 덜려고하는 것이 목표이고 다시 말해 인터페이스를 쪼개고 쪼개서 클래스가 단 하나의 책임(SRP)을 지니게 하는 것을 도와준다고 보면 된다.
필자가 작성한 예제를 보고 이해해보자.
[예제]
[ISP 적용 전]
Car (Interface)
package jeongkyun.solid.isp;
public interface Car {
String autoDrive();
String autoParking();
String drive();
String break();
}
Tesla (Class)
package jeongkyun.solid.isp;
public class Telsa implements Car {
@Override
public String autoDrive() {
return "autoDrive";
}
@Override
public String autoParking() {
return "autoParking";
}
@Override
public String drive() {
return "drive";
}
@Override
public String break() {
return "break";
}
}
우선 여기까지 작성한 내용을 설명하면,
Tesla 클래스는 Car라는 상위 클래스의 인터페이스를 상속받아 오버라이딩하여서 해당 기능들을 사용하고있다. 그런데 아래의 예제와 같이 만약 autoDrive, autoParking 기능을 지원하지 않는 차량이 있다면 어떻게 해야할까?
Ray (Class)
package jeongkyun.solid.isp;
public class Ray implements Car {
//해당 기능을 사용 안하고싶음!!!!!
@Override
public String autoDrive() {
return "";
}
//해당 기능을 사용 안하고싶음!!!!!
@Override
public String autoParking() {
return "autoParking";
}
@Override
public String drive() {
return "drive";
}
@Override
public String break() {
return "break";
}
}
위와 같이 전기차에만 지원하는 autoDrive와 autoParking은 사용하고 싶지 않을때 isp의 인터페이스 분리 원칙을 적용시키면 된다. 아래에서 어떻게 적용하는지 살펴보자.
[ISP 적용 후]
Car (Interface)
package jeongkyun.solid.isp;
public interface Car {
String drive();
String break();
}
ElectricCar (Interface)
package jeongkyun.solid.isp;
public interface ElectricCar {
String autoDrive();
String autoParking();
}
Tesla (Class)
package jeongkyun.solid.isp;
public class Telsa implements Car,ElectricCar {
@Override
public String autoDrive() {
return "autoDrive";
}
@Override
public String autoParking() {
return "autoParking";
}
@Override
public String drive() {
return "drive";
}
@Override
public String break() {
return "break";
}
}
Ray (Class)
package jeongkyun.solid.isp;
public class Ray implements Car {
@Override
public String drive() {
return "drive";
}
@Override
public String break() {
return "break";
}
}
이렇게 위의 예제와 같이 인터페이스를 클래스(객체)의 기능에 맞게 SRP의 개념을 생각해서 잘개 쪼개어 사용하는 것을 ISP라 말한다.
이렇게 SOLID 원칙에 근거하여 작성을 하게되면 클래스의 책임을 덜어주고 기능에 의존하지 않게 하는 것이 확장성과 다른 클라이언트에 미치는 영향을 최소화 하는 것을 알 수 있다.
P.S.
isp를 설명하기 위해 전기차와 내 기준 일반 자동차인 Ray를 나누어 예제를 작성해보았는데 Ray 자동차를 절대 무시하는것이 아니니 오해하지 말아주세요!!
댓글