객체지향프로그래밍

SOLID 5원칙 - ISP 인터페이스 분리 원칙(Interface Segregation Principle)

쿠쿠s 2022. 1. 20. 10:42

인터페이스 분리 원칙은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.

인터페이스 분리 원칙은 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써 클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게 한다.

특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터 페이스 하나보다 낫다 라는 뜻 입니다.

 

바로 예시 코드를 들어 간단하게 설명 하도록 하겠습니다.

 

 

우선 ISP를 위반한 코드를 보여드리겠습니다.

interface Car{
    void rideCar();
    void Accel();
    void stop();
    void UseElectric();
}

class K3 implements Car{
    @Override
    public void rideCar() {
        System.out.println("K3에 탑승했습니다.");
    }
    @Override
    public void Accel() {
        System.out.println("악셀을 밟습니다.");
    }
    @Override
    public void stop() {
        System.out.println("브레이크를 밟아 멈춥니다.");
    }
    @Override
    public void UseElectric() {
        System.out.println("K3 차량은 전기를 사용할 수 없습니다");
    }
}

 

 

Car 라는 인터페이스가 있고,  K3는 Car인터페이스를 구현한 클래스 입니다.여기서 UseElectric 이라는 기능이 있습니다. K3는 전기차가아니라서 해당 기능을 수행할 수 없습니다.자신이 이용하지 않는 메서드를 구현하고있어 ISP를 위반을 하게 됩니다. 하나의 인터페이스의 기능이 범용성(자동차의기능 + 전기차의 기능) 을 가지게 되면 이런 문제가 발생한는 것 입니다.

 

해결방법은 인터페이스를 분리하는 것 입니다!

 

 

interface Car{
    void rideCar();
    void Accel();
    void stop();
}

interface  electricCar{
    void UseElectric();
}

class K3 implements Car{
    @Override
    public void rideCar() {
        System.out.println("K3에 탑승했습니다.");
    }
    @Override
    public void Accel() {
        System.out.println("악셀을 밟습니다.");
    }
    @Override
    public void stop() {
        System.out.println("브레이크를 밟아 멈춥니다.");
    }
}

class Tesla implements Car, electricCar{
    @Override
    public void rideCar() {
        System.out.println("테슬라에 탑슿했습니다.");
    }

    @Override
    public void Accel() {
        System.out.println("악셀을 밟습니다");
    }

    @Override
    public void stop() {
        System.out.println("브레이크를 밟아 멈춥니다.");
    }

    @Override
    public void UseElectric() {
        System.out.println("전기를 사용합니다.");
    }
}

 

 

Car의 인터페이스는 모든 자동차가 가지는 기능만 이용하고, 전기차만이 가지는 기능은 따로 인터페이스를 만들어 아래와 같이 ISP 인터페이스 분리 원칙을 지키면서 K3 , Tesla 구현 클래스를 만들 수 있게 됩니다.

 

 

 

 

 

 

참고 - 김영한 스프링 핵심원리 기본편, 위키백과