[C#] Dependency Injection Pattern

Lingtea_luv·2025년 4월 13일
0

C#

목록 보기
31/37
post-thumbnail

의존성 주입(DI) 패턴


의존성 주입은 인스턴스를 외부에서 생성하여 넘겨주는 것을 의미한다. 의존성 주입을 활용하면 클래스 간 결합도를 낮출 수 있고, 클래스의 개방폐쇄원칙을 지킬 수 있다.

As - Is (의존성 주입이 없는 경우)

public class HPBar
{
	public void Change(int mount)
    {
    	Console.WriteLine($"change HP {mount}");
    }
}

public class Monster
{
	private readonly HPBar _hpbar;
    
    public Monster()
    {
    	_hpbar = new HPBar();
    }
    
    public void Hit()
    {
    	_hpbar.Change("10");
    }
}

class program
{
	static void Main(string[] args)
    {
    	Monster monster = new Monster();
        monster.Hit();
    }
}

위 코드의 경우 Monster 클래스가 HPBar 클래스에 의존성을 가지고 있다.
즉 Mosnter 클래스는 HPBar 클래스와 강하게 결합되어있어, HPBar의 클래스를 변경할 경우 Monster 클래스도 영향을 받는 것이다.

To - Be (의존성 주입을 적용한 경우)

public interface IBar
{
	void Change(int mount);
}

public class HPBar : IBar
{
	public void Change(int mount)
    {
    	Console.WriteLine($"change HP {mount}");
    }
}

public class Monster
{
	private readonly IBar _hpbar;
    
    public Monster(IBar bar)
    {
    	_hpbar = bar;
    }
    
    public void Hit()
    {
    	_hpbar.Change("10");
    }
}

class program
{
	static void Main(string[] args)
    {
    	IBar bar = new HPBar();
    	Monster monster = new Monster(bar);
        monster.Hit();
    }
}

위 코드는 Monster 클래스가 IBar 인터페이스에서 의존성을 주입 받고 있다.
이렇게 되면 Monster와 HPBar 사이의 결합도가 낮아지며, Main 메서드에서 IBar 인스턴스를 생성하고 이를 Monster 생성자를 통해 주입하고 있기에 Monster 클래스는 HPBar 변동에 대해 영향을 받지 않게 된다.

의존성 주입 구현

위에 작성된 코드는 생성자를 통해 의존성을 주입했다고 하여 생성자 주입이라고 한다. 클래스의 의존성을 생성자의 매개변수로 받아들이고, 클래스의 상태가 인스턴스 생성 이후 변하지 않는다는 장점이 있다.

public class Monster
{
	private readonly IBar _hpbar;
    
    public Monster(IBar bar)  // 생성자 주입
    {
    	_hpbar = bar;
    }
    
    public void Hit()
    {
    	_hpbar.Change("10");
    }
}

이러한 장점으로 생성자 주입은 클래스가 생성될 때 필요한 모든 의존성을 보장 받을 수 있다.

profile
뚠뚠뚠뚠

0개의 댓글