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

MINO·2024년 9월 12일
post-thumbnail

2024-09-12


SOLID

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

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

Dependency Inversion Principle

의존 역전 원칙 (DIP) : 고수준 모듈과 저수준 모듈이 서로 의존하지 않도록 하고, 대신 추상화(인터페이스나 추상 클래스) 에 의존하도록 한다는 원칙이다.

즉,
1. 고수준 모듈은 저수준 모듈에 의존해서는 안 된다.
- 둘 다 추상화에 의존해야 한다.
2. 추상화는 세부사항에 의존해서는 안 된다.
- 세부사항이 추상화에 의존해야 한다.
- 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.

고수준 모듈 : 어떤 의미 있는 단일 기능을 제공하는 모듈 (interface, 추상 클래스)
저수준 모듈 : 고수준 모듈의 기능을 구현하기 위해 필요한 하위 기능의 실제 구현 (메인클래스, 객체)

왜?

  • 코드의 유연성 증가
    • 고수준 모듈이 저수준 모듈에 의존하지 않게 되어, 특정 구현을 변경하더라도 고수준 모듈에 영향을 미치지 않는다.
  • 재사용성 향상
    • 인터페이스나 추상 클래스에 의존하게 되면, 다양한 구현체를 쉽게 교체할 수 있다.
  • 모듈의 책임 분리에 의한 유지보수성 증가
    • DIP 를 적용하여 각 모듈의 책임이 분리되고, 이는 유지보수를 용이하게 한다.
  • 변경에 대한 저항력 증가
    • 시스템의 요구 사항이 변경될 때, 변경에 대한 저항력이 더 높다.
      새로운 기능이나 요구 사항이 생길 때 기존의 코드 구조를 크게 변경하지 않고도 대응할 수 있다.

예시

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

Player 클래스 : Weapon 클래스를 직접 생성하고 의존하는 구조

public class Weapon
{
    public void Attack()
    {
        Console.WriteLine("Attacking with the weapon!");
    }
}

public class Player
{
    private Weapon _weapon;

    public Player()
    {
        _weapon = new Weapon(); // 직접 의존
    }

    public void Attack()
    {
        _weapon.Attack();
    }
}

// 실제 플레이어 공격 호출
Player player = new Player();
player.Attack();

이때, 만약 무기를 변경해야 한다면 Player 클래스를 직접 수정해야 한다.


DIP 가 제대로 지켜진 코드

IWeapon 인터페이스 : 공격을 위한 인터페이스

public interface IWeapon
{
    void Attack();
}

public class Sword : IWeapon
{
    public void Attack()
    {
        Console.WriteLine("검 휘두르기");
    }
}

public class Bow : IWeapon
{
    public void Attack()
    {
        Console.WriteLine("활 쏘기");
    }
}

public class Player
{
    private IWeapon _weapon;

    public Player(IWeapon weapon) // 의존성
    {
        _weapon = weapon;
    }

    public void Attack()
    {
        _weapon.Attack();
    }
}


// 플레이어 공격 호출
IWeapon sword = new Sword();
Player playerWithSword = new Player(sword);
playerWithSword.Attack();

IWeapon bow = new Bow();
Player playerWithBow = new Player(bow);
playerWithBow.Attack();

이를 통해, Player 클래스는 각각 다른 무기 클래스에 의존하지 않게 된다.

즉, Player 클래스는 IWeapon 인터페이스에 의존하며, 다양한 무기(Sword, Bow)를 인스턴스화하여 사용할 수 있다.
무기를 쉽게 변경할 수 있고, 새로운 무기를 추가하는 것도 간편해진다는 이점이 있다.


TIL 마무리

객체지향의 5대 원칙인 SOLID 를 마무리 지었다.

처음부터 SOLID 원칙을 잘 준수하며 코드를 짜기는 어렵겠지만,

더 많은 코드를 작성해보고, 리팩토링하는 과정을 거쳐 성장할 수 있을 거라고 생각한다.

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

0개의 댓글