ISP
Interface Segregation Principle(인터페이스 분리 원칙)
: 클라이언트가 자신이 이용하지 않는 메서드에 의존하면 안된다는 원칙
역시나 이번에도 도통 무슨 말인지 모르시겠죠? ㅎㅎ
그래서 조금 쉽게 설명드리면~!
특정 객체(클래스)에 대한 책임을 덜어드리는 것이 목표에요!
다시 말해서 기능을 쪼개고 쪼개서 클래스가 단 하나의 책임(SRP)을 지니게 하는 것을 도와줍니다!
현실세계를 예로 들어볼까요?
제가 스마트폰을 개발하는 담당자 라고 가정해봅시다
지금 갤럭시1 이라는 객체(클래스)에는 전화, MP3, 인터넷 기능만 존재했어요
하지만 버젼 업그레이드를 계속 진행하면서 갤럭시2를 출시하게 됬는데,
MP3 기능이 빠지고 동영상 기능이 들어가서 전화, 동영상, 인터넷 기능만 존재하게 됬습니다
이렇게 가정했을 때, 갤럭시2와 갤럭시1을 아우루는 스마트폰(인터페이스)에는 모든 기능이 들어가야 할까요?
너무 책임이 과하지 않을까요?
그래서 분리를 하는겁니다!
바로 실제 코드로 봅시다!
실제 예시
먼저, 처음에 기능을 구상한 인터페이스(SmartPhone)입니다!
package solid.isp;
public interface SmartPhone {
String telephone();
String mp3();
String internet();
}
먼저 기능 명세서를 인터페이스 적어준 모습이죠!
그래서 위를 바탕으로 실체화를 해볼까요?
package solid.isp;
public class Galaxy1 implements SmartPhone {
@Override
public String telephone() {
return "ring ring";
}
@Override
public String mp3() {
return "play mp3";
}
@Override
public String internet() {
return "connect complete!";
}
}
네~ 그래서 실체화가 되었습니다!! 짝짝짝
이제 버젼업그레이드 할려고 Galaxy2를 만들어볼까해요!!
하지만 문제가 생깁니다
package solid.isp;
public class Galaxy2 implements SmartPhone {
@Override
public String telephone() {
return "ring ring";
}
@Override // 나는 이 기능을 삭제하고 싶은데???????
public String mp3() {
return "play mp3";
}
@Override
public String internet() {
return "connect complete!";
}
public String video() {
return "play video";
}
}
Galaxy2는 이미 SmartPhone 인터페이스에 의해서 의존되어 있습니다
아아.. 정말 망했어요ㅠㅠ 이럴때는 어떻게 하죠?
분리하는 것 입니다!
정말 다양한 방법이 있겠지만, 제 스타일대로 분리해보았어요!
먼저 공통 기능만 SmartPhone 인터페이스에 유지되게 해봤어요
package solid.isp;
public interface SmartPhone {
String telephone();
String internet();
}
다음은 Galaxy1 만 가지고 있는 기능을 인터페이스로 묶었죠!
package solid.isp;
public interface Galaxy1Function {
String mp3();
}
그러면~~ Galaxy1 클래스를 다음과 같이 리팩토링 할 수 있어요!
package solid.isp;
public class Galaxy1 implements SmartPhone, Galaxy1Function {
@Override
public String telephone() {
return "ring ring";
}
@Override
public String mp3() {
return "play mp3";
}
@Override
public String internet() {
return "connect complete!";
}
}
이렇게 하고보니 훨씬 깔끔해졌죠?
인터페이스를 분리하여 다중 상속하니 설계자의 입맛대로 구현할 수 있네요!!
마찬가지로, Galaxy2도 리팩토링 해봅시다!
package solid.isp;
public interface Galaxy2Function {
String video();
}
인터페이스를 분리하고요~
package solid.isp;
public class Galaxy2 implements SmartPhone, Galaxy2Function {
@Override
public String telephone() {
return "ring ring";
}
@Override
public String internet() {
return "connect complete!";
}
public String video() {
return "play video";
}
}
와우~~ 정말 깔끔해졌어요!ㅎㅎ
조금 더 독자분들이 보기 쉽게 uml도 첨부할게요!
Why ISP?
길고 긴 코드를 보고 나니까 왜 ISP를 꼭 지켜야하는지 감이 오셨나요?
클래스의 책임을 덜어주고 기능에 의존하지 않게 하는 것이 확장성에 정말 용이하다는 것을
알게 해준 제 정리글이었어요ㅎㅎ
객체지향 5대 설계원칙은 꼭 준수하는 Clean Coder가 되길 바랍니다~!
참고
인터페이스 분리 원칙
'Developer > Kotlin & Java' 카테고리의 다른 글
자바 직렬화 - Java Serialization (0) | 2020.03.20 |
---|---|
SOLID - DIP(Dependency Inversion Principle)란 : 의존성 역전 원칙 (8) | 2019.11.27 |
SOLID - LSP(Liskov Substitution Principle)이란? 리스코프 치환 원칙 (0) | 2019.11.22 |
SOLID - OCP(Open Closed Principle) : 개방 폐쇄 원칙 (0) | 2019.11.17 |
SOLID - SRP(Single Responsibility Principle) : 단일책임 원칙 (2) | 2019.11.17 |