## SOLID - ISP # 20240326 피어세션 ## 🥬 상추 ### ISP (Interface Segregation Principle - 인터페이스 분리 원칙) - 정의: ISP, 즉 인터페이스 분리 원칙은 "클라이언트가 자신이 사용하지 않는 메소드에 의존하도록 강제해서는 안 된다"는 개념을 말합니다. 다시 말해, 하나의 범용 인터페이스보다는 여러 개의 구체적인 인터페이스가 낫다는 원칙입니다. - 목적: 클라이언트(인터페이스를 사용하는 코드)가 필요하지 않은 기능에 의존하지 않도록 하여, 시스템의 결합도를 낮추고, 변경에 대한 유연성을 증가시키는 것입니다. - 구현 방법: 대규모 인터페이스를 구현하는 대신, 필요한 특정 기능만을 제공하는 더 작고 구체적인 인터페이스들로 분리합니다. 이렇게 함으로써 클래스는 필요한 인터페이스만을 구현하여, 불필요한 의존성을 줄일 수 있습니다. <br> <br> ## 🌱 애셔 - 인터페이스 분리 원칙은 "클라이언트는 자신이 사용하지 않는 인터페이스에 의존 관계를 맺으면 안 된다"는 원칙. - 즉, 인터페이스는 사용자가 필요로 하는 기능에 따라 적절하게 분리돼야 한다. ### 장점 1. 낮은 결합도 2. 유연성과 확장성 3. 클라이언트 코드의 간결성 ### 단점 1. 복잡성 증가 2. 추상화의 어려움 3. 설계 시간 증가 ```java interface ISmartPhone { void call(String number); // 통화 기능 void message(String number, String text); // 문제 메세지 전송 기능 void wirelessCharge(); // 무선 충전 기능 void AR(); // 증강 현실(AR) 기능 void biometrics(); // 생체 인식 기능 } ``` - 동작을 못하는 기능이 있어도 추상 메소드 구현 규칙상 오버라이딩은 하되, 메서드 내부는 빈공간으로 두거나 혹은 예외를 발생토록 구성해야 한다. - 결국 필요하지도 않은 기능을 어쩔수없이 구현해야하는 낭비가 발생된 것이다. ```java interface IPhone { void call(String number); // 통화 기능 void message(String number, String text); // 문제 메세지 전송 기능 } interface WirelessChargable { void wirelessCharge(); // 무선 충전 기능 } interface ARable { void AR(); // 증강 현실(AR) 기능 } interface Biometricsable { void biometrics(); // 생체 인식 기능 } ``` ```java class S21 implements IPhone, WirelessChargable, ARable, Biometricsable {} class S3 implements IPhone {} ``` #### 출처: https://inpa.tistory.com/entry/OOP-💠-아주-쉽게-이해하는-ISP-인터페이스-분리-원칙 [Inpa Dev 👨‍💻:티스토리] <br> <br> ## 💧 웨이드 - 요약 설명 - 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 합니다. - 클라이언트가 필요로 하는 메서드로만 구성된 인터페이스를 제공해야 합니다. - 이는 더 큰 인터페이스를 더 작은 인터페이스로 분할해야 함을 의미합니다. - 목적과 필요성 - 이를 통해 구현 클래스가 관심 있는 메서드만 사용하도록 할 수 있습니다. - 예제 코드 ```java public interface BearKeeper { void washTheBear(); void feedTheBear(); void petTheBear(); } ``` ```java public interface BearCleaner { void washTheBear(); } public interface BearFeeder { void feedTheBear(); } public interface BearPetter { void petTheBear(); } ``` ```java public class CrazyPerson implements BearPetter { public void petTheBear() { //Good luck with that! } } ``` 이러한 인터페이스 분리를 통해 필요한 메서드만 선택해서 구현할 수 있습니다. - 출처 https://www.baeldung.com/solid-principles#interface-segregation-principle-isp <br> <br> ## 🍜 짜왕 ISP, 인터페이스 분리 원칙은 객체지향 디자인의 SOLID 원칙 중 하나이다. 인터페이스를 사용하는 클래스가 "**사용하지 않는 메서드에 의존되어서는 안된다**"라는 점이 강조되는데 이는 인터페이스가 **구현 클래스와 관련있는 메소드로만 구성되어야** 한다는 것이다! 문서 처리 시스템을 예시로 들어보자. ```java public interface IDocument { void Open(); void save(); void print(); } ``` 위와 같이 다양한 기능을 하는 문서 처리 시스템이 인터페이스로 설계되어 있다. 이 인터페이스를 구현하고자 하면 아래와 같이 클래스를 구현해야할 것이다. ```java public class WordDocument : IDocument { public void Open() { // Word 문서 로직 열기 } public void Save() { // Word 문서 로직 저장 } public void Print() { // Word 문서 로직 인쇄 } } public class PDFDocument : IDocument { public void Open() { // PDF 문서 로직 열기 } public void Save() { // PDF 문서 로직 저장 } public void Print() { // PDF 문서 로직 인쇄 } } ``` 이렇게 된다면, WordDocument및 PDFDocument클래스 모두 필요하지 않은 메서드까지 구현해야 한다. 예를 들어, pdf 문서의 인쇄 로직을 사용하지 않고 싶은데 인터페이스를 구현하기 위해서는 어쩔 수 없이 구현해야 한다. 즉, 인터페이스 분리 원칙을 위반하고 있다. ISP를 지키면서 더 나은 설계를 하고자 하면 아래와 같이 설계할 수 있다. ```java public interface IOpenable { void Open(); } public interface ISaveable { void save(); } public interface IPrintable { void print(); } ``` * 출처 : [medium](https://medium.com/@sunny12jun/the-interface-segregation-principle-isp-35b16f91f4f8)