[꼼꼼한 개발자] 꼼코더

[JAVA] - ISP란?(Interface segregation principle, 인터페이스 분리 원칙이란?, 인터페이스 분리 예제) 간단하고 쉽게 이해하기 본문

간단하고 쉽게/JAVA

[JAVA] - ISP란?(Interface segregation principle, 인터페이스 분리 원칙이란?, 인터페이스 분리 예제) 간단하고 쉽게 이해하기

꼼코더 2023. 6. 12. 16:50
반응형

🧹 간단 요약

ISP란 인터페이스를 작은 단위로 분리하는 것이다.

즉 인터페이스를 계속 잘게 '잘' 나누어 분리하는 것이다.

 

'특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다' -인프런 김영한 님 강의 속 내용-

 

(자세한 내용은 아래에)

 

 

🤷🏻 ISP란?(Interface segregation principle)

ISP는 클라이언트가 필요로 하는 인터페이스를 작은 단위로 분리하고

클라이언트가 필요로 하지 않는 기능에 대한 의존성을 제거하는 것을 강조한다.

 

 

🙋🏻‍♂️ ISP에 의거한  인터페이스 분리방법

  1. 클라이언트가 사용하는 기능에만 포함된 작은 인터페이스를 정의해야 한다
  2. 인터페이스는 클라이언트에게 필요한 최소한의 기능만 제공해야 한다.
  3. 클라이언트는 자신이 사용하지 않는 기능에 대한 의존성을 갖지 않아야 한다.

(1번과 3번은 중복된 내용이라고 봐도 무방하다!)

 

 

👀 ISP의 장점

  1. 불필요한 의존성 제거
    • 클라이언트가 필요로하지 않는 기능에 대한 의존성을 제거함으로써 불필요한 종속성을 줄일 수 있다.
  2. 유연성과 확장성 향상
    • 작은 인터페이스는 변경이 쉽고 유연한 시스템을 구축할 수 있다.
    • 새로운 기능이 추가되거나 기존 기능이 변경되더라도 해당 인터페이스만 수정하면 된다.
  3. 재사용성 증가
    • 작은 인터페이스는 다른 클래스나 모듈에서 재사용하기 쉽다.
    • 클라이언트가 필요로 하는 기능에 따라 인터페이스를 선택적으로 구현할 수 있다.
    • ISP는 인터페이스를 효과적으로 설계하여 시스템을 더 모듈화 하고 유연하게 만드는 데 도움을 준다. 이를 통해 코드의 가독성과 유지 보수성을 향상시킬 수 있다.

 

🧑🏻‍💻 ISP를 따르지 않는 예시

// 인터페이스 분리 원칙을 적용하기 전

interface 자동차 {
    void 시동();
    void 가속();
    void 제동();
    void 조향();
}

class 스포츠카 implements 자동차 {
    @Override
    public void 시동() {
        System.out.println("스포츠카 시동을 걸었습니다.");
    }
    
    @Override
    public void 가속() {
        System.out.println("스포츠카를 가속시킵니다.");
    }
    
    @Override
    public void 제동() {
        System.out.println("스포츠카를 제동합니다.");
    }
    
    @Override
    public void 조향() {
        System.out.println("스포츠카를 조향합니다.");
    }
}

class 운전자 {
    private 자동차 빵빵이;
    
    public 운전자(자동차 빵빵이) {
        this.빵빵이 = 빵빵이;
    }
    
    public void 운전하기() {
        빵빵이.시동();
        빵빵이.가속();
        빵빵이.조향();
        빵빵이.제동();
    }
}

 

🧑🏻‍💻 ISP를 따르는 예시

// 인터페이스 분리 원칙을 적용한 후

interface 운전가능 {
    void 운전하기();
}

interface 가속가능 {
    void 가속();
}

interface 제동가능 {
    void 제동();
}

interface 조향가능 {
    void 조향();
}

class 스포츠카 implements 운전가능, 가속가능, 제동가능, 조향가능 {
    @Override
    public void 운전하기() {
        System.out.println("스포츠카를 운전합니다.");
    }
    
    @Override
    public void 가속() {
        System.out.println("스포츠카를 가속시킵니다.");
    }
    
    @Override
    public void 제동() {
        System.out.println("스포츠카를 제동합니다.");
    }
    
    @Override
    public void 조향() {
        System.out.println("스포츠카를 조향합니다.");
    }
}

class 운전자 {
    private 자동차 빵빵이;
    
    public 운전자(자동차 빵빵이) {
        this.빵빵이 = 빵빵이;
    }
    
    public void 운전하기() {
        자동차.운전하기();
    }
}

 

인터페이스 분리 원칙을 적용한 후에는 

자동차 인터페이스를 운전가능, 가속가능, 제동가능, 조향가능 인터페이스로 분리하였다.

 

스포츠카 클래스는 필요한 인터페이스들을 구현하도록 변경하였다.

따라서 만약 필요하지 않는 기능이 있다면(불필요한 인터페이스) 상속하지 않아도 된다.

 

운전자 클래스는 이제 운전가능 (필요한) 인터페이스에만 의존하도록 변경하였다.

이렇게 함으로써 운전자는 필요한 기능에만 의존하게 되고, 불필요한 의존성을 제거할 수 있다.

 

 

 

🧹 마무리 

"ISP는 클라이언트가 필요로 하는 인터페이스를 작은 단위로 분리하고

클라이언트가 필요로하지 않는 기능에 대한 의존성을 제거하는 것을 강조한다."
이로써 위에서 언급했던
내용이 이해가 됐을 것이다.!

 

 

 

Comments