본문 바로가기

Develop/소프트웨어 설계

[SOLID] Interface Segregation 원칙

반응형

목차

Single Responsibility 원칙

Open/Closed 원칙

Liskov Substitution 원칙

Interface Segregation 원칙

Dependency Inversion 원칙

 

 

SOLID 인터페이스 분리 원칙
Interface Segregation 원칙

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

인터페이스를 구현하는 클래스는 필요한 함수만 구현할 수 있도록 설계하자.

원칙에 따라 인터페이스는 최소한의 크기로 설계해야 한다. 그래야 클래스가 필요한 부분만 구현할 수 있다.

예제

청바지 가게에서 아래와 같이 상품을 구현한다고 하자.

public interface IProduct
{
    int ID { get; set; }
    double Weight { get; set; }
    int Stock { get; set; }
    int Inseam { get; set; }
    int WaistSize { get; set; }
}

public class Jeans : IProduct
{
    public int ID { get; set; }
    public double Weight { get; set; }
    public int Stock { get; set; }
    public int Inseam { get; set; }
    public int WaistSize { get; set; }
}

청바지 가게가 확장하여 아래와 같이 상품이 추가되면 문제가 발생한다.

public class BaseballCap : IProduct
{
    public int ID { get; set; }
    public double Weight { get; set; }
    public int Stock { get; set; }
    public int Inseam { get; set; }
    public int WaistSize { get; set; } // 야구모자에 필요없는 속성
    public int HatSize { get; set; }
}

IProduct 인터페이스로 인해 BaseballCap 클래스는 사용하지도 않을 WaistSize 속성을 구현해야 한다.

따라서 아래와 같이 리팩토링하여 문제를 해결한다. 먼저, 인터페이스를 최소단위로 구현한다.

public interface IProduct
{
    int ID { get; set; }
    double Weight { get; set; }
    int Stock { get; set; }
}
public interface IPants
{
    public int Inseam { get; set; }
    public int WaistSize { get; set; }
}
public interface IHat
{
    public int HatSize { get; set; }
}

변경된 인터페이스를 여러 개 상속하여 상품의 속성을 구현한다.

public class Jeans : IProduct, IPants
{
    public int ID { get; set; }
    public double Weight { get; set; }
    public int Stock { get; set; }
    public int Inseam { get; set; }
    public int WaistSize { get; set; }
}

public class BaseballCap : IProduct, IHat
{
    public int ID { get; set; }
    public double Weight { get; set; }
    public int Stock { get; set; }
    public int HatSize { get; set; }
}

이제 Jeans 클래스와 BaseballCap 클래스는 각자가 필요한 인터페이스만을 사용하여 필요한 속성만 구현하면 된다.

원칙 적용 전에 심사숙고할 사항

Interface Segregation (인터페이스 분리) 원칙은 인터페이스를 최소화하길 권장하기 때문에 인터페이스의 개수가 기하급수적으로 증가하게 되는 문제가 발생할 수 있다. 만약 원칙을 적용하여 거의 한 클래스당 한 인터페이스를 구현하기 시작했다면 문제가 있다.

반응형

'Develop > 소프트웨어 설계' 카테고리의 다른 글

[SOLID] Dependency Inversion 원칙  (0) 2019.08.30
[SOLID] Liskov Substitution 원칙  (0) 2019.08.29
[SOLID] Open/Closed 원칙  (0) 2019.08.27
[SOLID] Single Responsibility 원칙  (0) 2019.08.16
[SOLID] SOLID 원칙이란  (2) 2019.08.15