본문 바로가기

Java/Methodology

[SOLID] 객체지향 설계 5원칙 - ISP

  • ISP (Interface Segregation Principle)

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

한마디로 구현 객체는 무의미한 메소드의 구현을 방지하고 반드시 필요한 메소드만을 구현해야한다는 원칙이다.
만약 구현해야하는 Interface가 너무 크다면 해당 Interface를 세분화해야한다.

예를들어 2000년식 아반떼가 있고 2020년식 아반떼가 있다.
2020년식 아반떼에는 앞으로 간다, 뒤로 간다, 멈춘다라는 기본적인 기능 이외에
크루즈컨트롤, 무선충전, 네비게이션등 일반적인 차량 기능외에 많은 새로운 기능이 들어가있다.

이러한 점을 가지고 Car라는 Interface를 구현하면 아래와 같을 것이다.

public interface Car {
    void goFoward();
    void goBack();
    void stop();
    void cruiseControl();
    void wirelessCharge();
    void navigate();
}

만약 2000년식 아반떼가 이러한 인터페이스를 구현한다면 어떻게 될까?
cruiseControl, wirelessCharge, navigate의 구현부는 비어있게 될 것이다.
이렇게 되면 인터페이스 분리 원칙을 지키지 못한 것이 된다.

그러면 지금부터 ISP를 지키기위해 Car Interface를 분리해보도록 하자.

public interface Car {
    void goFoward();
    void goBack();
    void stop();
}
public interface DrivingAssistant {
    void cruiseControl();
}
public interface Battery {
    void wirelessCharge();
}
public interface Navigation {
    void navigate();
}

Car라는 Interface를 Car, DrivingAssistant(주행보조), Battery(배터리 관련), Navigation으로 분리하였다.
이제 ISP를 지키기 위해서 2000년식 아반떼의 구현체(Avante2000)와 2020년식 아반떼의 구현체(Avante2020)을 살펴보도록 한다.

public class Avante2000 implements Car {
    @Override
    public void goForward() {}
    @Override
    pubic void goBack() {}
    @Override
    public void stop() {}
}
public class Avante2020 implements Car, DrivingAssistant, Battery, Navigation {
    @Override
    public void goForward() {}
    @Override
    public void goBack() {}
    @Override
    public void stop() {}
    @Override
    public void cruiseControl() {}
    @Override
    public void wirelessCharge() {}
    @Override
    public void navigate() {}
}

이제 Car Interface가 분리되었기 때문에 2000년식 아반떼는 Car Interface를 구현할 때 자신에게 없는 기능을 강제로 구현해야할 필요가 없어졌다.
2020년식 아반떼의 경우 Car이외에 DrivingAssistant와 Battery, Navigation을 구현하여 자신이 가지고 있는 기능들을 선택적으로 추가구현할 수 있게 되었다.