[TIL] 디자인 패턴 - SOLID (I)

MINO·2024년 9월 11일
post-thumbnail

2024-09-11


SOLID 원칙

소프트웨어 설계에서 지켜야 할 다섯 가지 핵심 원칙

유연하고 관리하기 쉬운 객체 지향 설계를 추구하기 위해 사용된다.


Interface Segregation

인터페이스 분리 원칙 (ISP) : 클라이언트가 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 작게 분리해야 한다는 원칙이다.

즉, 한 클래스에서 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다.


왜?

  • 클라이언트와 인터페이스 사이의 결합도 감소
    • 자신이 필요로 하는 메서드만 포함된 인터페이스에 의존하므로,
      불필요한 메서드에 의존하지 않게 된다.
  • 유지보수 및 더 나은 설계
    • 인터페이스가 작고 구체적일수록 코드의 가독성이 높아져 직관적이고 이해하기 쉬운 코드가 된다.
  • 다양한 클라이언트가 서로 다른 요구사항을 가져, 특정 기능에 맞는 인터페이스를 제공
    • 코드의 재사용성을 높이고, 테스트에 용이하다.

예시

ISP 가 제대로 지켜지지 않은 코드

IAnimal 인터페이스 : 동물들의 행동(Fly, Swim, Eat) 들을 정의
Dog 클래스 : Swim, Eat 행동이 가능
Bird 클래스 : Fly , Eat 행동이 가능

public interface IAnimal
{
    void Fly();
    void Swim();
    void Eat();
}

public class Dog : IAnimal
{
    public void Fly()
    {
        // 개는 날 수 없지만, 인터페이스를 구현해야 하므로 빈 메서드
    }

    public void Swim()
    {
        Console.WriteLine("개가 수영합니다.");
    }

    public void Eat()
    {
        Console.WriteLine("개가 먹이를 먹습니다.");
    }
}

public class Bird : IAnimal
{
    public void Fly()
    {
        Console.WriteLine("새가 날고 있습니다.");
    }

    public void Swim()
    {
        // 새는 수영할 수 없지만, 인터페이스를 구현해야 하므로 빈 메서드
    }

    public void Eat()
    {
        Console.WriteLine("새가 먹이를 먹습니다.");
    }
}

동물들의 행동 (Fly, Swim, Eat) 메서드를 IAnimal 이라는 인터페이스에 구현하여
자신이 사용하지 않는 메서드(Dog - Fly , Bird - Swim) 도 구현해야 한다.


ISP 가 제대로 지켜진 코드

동물들의 행동을 필요한 메서드만 포함해 쪼개 구현한다.
IFlyable : 날 수 있는 동물들을 위한 인터페이스
ISwimmable : 수영할 수 있는 동물들을 위한 인터페이스
IEatable : 먹이를 먹는 동물들을 위한 인터페이스

public interface IFlyable
{
    void Fly();
}

public interface ISwimmable
{
    void Swim();
}

public interface IEatable
{
    void Eat();
}

public class Dog : ISwimmable, IEatable
{
    public void Swim()
    {
        Console.WriteLine("개가 수영합니다.");
    }

    public void Eat()
    {
        Console.WriteLine("개가 먹이를 먹습니다.");
    }
}

public class Bird : IFlyable, IEatable
{
    public void Fly()
    {
        Console.WriteLine("새가 날고 있습니다.");
    }

    public void Eat()
    {
        Console.WriteLine("새가 먹이를 먹습니다.");
    }
}

ISP 를 준수하여 코드를 작성했기 때문에,
클라이언트가 사용하지 않는 메서드를 구현할 필요 없이
필요한 메서드만 포함된 인터페이스에 의존한다.


정리

SOLID 법칙의 I 인터페이스 분리 원칙에 대해 살펴보았다.

간단하게 동물들의 행동을 통해 예제 코드를 구현해보며, 인터페이스가 어떻게 설계되어야 하는지를 이해하는 데 큰 도움이 되었다.

인터페이스를 작고 구체적으로 나누는 것이 크게 특별한 기법은 아니지만,
사소한 디테일 하나가 유지보수와 가독성에 큰 영향을 미친다는 것을 알 수 있었다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글