YJ/관련 이론

[SOLID] ISP_인터페이스 분리 원칙

Team DAON 2022. 9. 25. 01:17

[ISP]

  • "하나의 일반적인 인터페이스보다는 여러 개의 구체적인 인터페이스가 낫다"
    • 목적과 관심이 다른 클라이언트들은 각각의 인터페이스를 통해 분리
    • 하나의 인터페이스는 하나의 역할에 대한 기능만 수행
    • 타기능 완전 삭제 or 별도의 인터페이스 생성
  • 클라이언트의 목적과 용도에 필요한 인터페이스만 제공
    • 기능을 더 작은 기능들의 집합으로 쪼개서 필요한 기능만 수행
    • 어떤 클래스가 다른 클래스에 종속될 때는 가능한 최소한의 인터페이스만 사용
  • 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함
  • SRP(단일 책임 원칙)과 유사한 목표
    • SRP → 클래스 관련
    • ISP → 인터페이스 관련

[Example]

  • Bad Example
    • 원하는 않는 기능까지 모두 overriding해야 구현 가능
// ISP Bad Example

// 원하지 않은 함수까지 모두 overriding
interface DogCare{
    String wash();
    String eat();
    String walk();
    
}

class AllCare implements DogCare{
    @Override
    public String wash(){
        return "Wash";
    }
    
    @Override
    public String eat(){
        return "Eat";
    }
    
    @Override
    public String walk(){
        return "Walk";
    }
}

public class MyClass {
    public static void main(String args[]) {
        AllCare dubucare = new AllCare();
        
        System.out.println("Today's care : " + dubucare.wash());
        System.out.println("Today's care : " + dubucare.eat());
        System.out.println("Today's care : " + dubucare.walk());
    }
}

 

  • Good Example
    • 필요한 interface만 implements해 구현 가능
// ISP Good Example

// 필요한 함수만 overriding 가능
interface DogWash{
    String wash();
}

interface DogEat{
    String eat();
}

interface DogWalk{
    String walk();
}

class RainyCare implements DogWash, DogEat{
    @Override
    public String wash(){
        return "Wash";
    }
    
    @Override
    public String eat(){
        return "Eat";
    }
}

class SunnyCare implements DogWash, DogEat, DogWalk{
    @Override
    public String wash(){
        return "Wash";
    }
    
    @Override
    public String eat(){
        return "Eat";
    }
    
    @Override
    public String walk(){
        return "Walk";
    }
}

public class MyClass {
    public static void main(String args[]) {
        RainyCare rainycare = new RainyCare();
        SunnyCare sunnycare = new SunnyCare();
        
        System.out.println("Rainy Day care : " + rainycare.wash());
        System.out.println("Rainy Day care : " + rainycare.eat());
        
        System.out.println("Sunny Day care : " + sunnycare.wash());
        System.out.println("Sunny Day care : " + sunnycare.eat());
        System.out.println("Sunny Day care : " + sunnycare.walk());
    }
}