Skip to content

SOLID: Interface Segregation Principle (인터페이스 분리 원칙)

VG edited this page Dec 19, 2020 · 11 revisions

ISP (인터페이스 분리 원칙)

인터페이스를 상속 받았을 때, 자신이 사용하지 않는 메소드는 구현하지 말아야 한다.


다양한 기능을 가지고 있는 한개의 인터페이스보다,
단일 기능을 가지고 있는 여러 인터페이스를 구현하는것이 낫다는 말이다.


위반 예제 C#

이칙 연산 계산기

public interface IArithmetic
{
    float plus(float a, float b);
    float minus(float a, float b);
    float mul(float a, float b);
    float div(float a, float b);
}
public class CalculatorPM : IArithmetic
{
    public float plus(float a, float b) {return a + b;}
    public float minus(float a, float b) {return a - b;}
    public float mul(float a, float b) {Debug.WriteLine("지원하지 않는 함수"); return null;}
    public float div(float a, float b) {Debug.WriteLine("지원하지 않는 함수"); return null;}
}
public class CalculatorMD : IArithmetic
{
    public float plus(float a, float b) {Debug.WriteLine("지원하지 않는 함수"); return null;}
    public float minus(float a, float b) {Debug.WriteLine("지원하지 않는 함수"); return null;}
    public float mul(float a, float b) {return a * b;}
    public float div(float a, float b) {return a / b;}
}

IArithmetic 인터페이스는 모든 사칙연산 기능을 가지고 있다.
∴IArithmetic를 상속받는 클래스들은 모든 사칙연산 메소드를 구현해야 한다.

그러나,
CalculatorPM 클래스는 덧셈와 뺄셈 만을 지원하고,
CalculatorMD 클래스는 곱셈과 나눗셈 만을 지원한다.

IArithmetic인터페이스를 상속 받는다는 이유로, 지원하지 않는 기능을 구현해야만 하는 상황이 생긴 것이다.🛑ISP위반

그렇다면 어떻게 고쳐야 할까?

public interface IPlus { float plus(float a, float b); }
public interface IMinus { float minus(float a, float b); }
public interface IMul{ float mul(float a, float b); }
public interface IDiv { float div(float a, float b); }
public class CalculatorPM : IPlus, IMinus
{
    public float plus(float a, float b) {return a + b;}
    public float minus(float a, float b) {return a - b;}
}
public class CalculatorMD : IMul, IDiv
{
    public float mul(float a, float b) {return a * b;}
    public float div(float a, float b) {return a / b;}
}

각각의 연산 기능을 각각의 인터페이스로 분리하였고,
이렇게 해서, 이칙 연산 클래스가 원하는 기능만 상속, 구현할 수 있게 되었다.

Clone this wiki locally