자 마흔 일곱 번째 키워드인 '의존 역전 원칙'을 알아 볼 것이다.
이번 키워드는 이전 키워드인 OCP처럼 SOLID원칙중 하나 이므로
직접 코드로 알아보았다.

의존 역전 원칙(Dependency Inversion Principle, DIP)은 소프트웨어 모듈의 결합도를 낮추기 위한 설계 원칙이다.
다음 두가지의 규칙을 포함 한다고 한다.
// Light 클래스가 구체적인 구현
public class Light : MonoBehaviour
{
public void TurnOn()
{
Debug.Log("Light: Turned On");
}
public void TurnOff()
{
Debug.Log("Light: Turned Off");
}
}
// Switch 클래스가 Light 클래스에 직접 의존
public class Switch : MonoBehaviour
{
private Light _light;
void Start()
{
_light = new Light();
}
public void Operate(string action)
{
if (action == "ON")
{
_light.TurnOn();
}
else if (action == "OFF")
{
_light.TurnOff();
}
}
}
위 코드는 Light Class와 Switch Class로 나뉘어 구현하였는데 Light 클래스에서 구체적인 구현을 하고
Switch클래스에서 직접 의존하여 구현시킨 결과이다.
적은 양의 구현이 되어있어서 수정이 많이 필요없지만 나중에 방대한 양이 들어간다고 가정했을 때
Light Class에서 수정이 되었다면 의존한 클래스에서도 수정을 해야할 상황이 생기기 때문에
의존성을 낮춰야 한다.
public interface ISwitchable
{
void TurnOn();
void TurnOff();
}
public class Light : MonoBehaviour, ISwitchable
{
public void TurnOn()
{
Debug.Log("Light: Turned On");
}
public void TurnOff()
{
Debug.Log("Light: Turned Off");
}
}
public class Switch : MonoBehaviour
{
private ISwitchable _device;
// 의존성을 주입하는 생성자
public Switch(ISwitchable device)
{
_device = device;
}
public void Operate(string action)
{
if (action == "ON")
{
_device.TurnOn();
}
else if (action == "OFF")
{
_device.TurnOff();
}
}
}
public class GameManager : MonoBehaviour
{
void Start()
{
ISwitchable light = new Light();
Switch lightSwitch = new Switch(light);
lightSwitch.Operate("ON");
lightSwitch.Operate("OFF");
}
}
코드 설명
이렇게 설계하면 나중에 Light와 다른 ISwitchable 구현을 추가할 때, Switch 클래스를 전혀 수정하지 않아도 된다.
이렇게 인터페이스를 쪼개는 이유를 여기서 알았다. 쪼개는 이유는 어디든 있고 이렇게 쪼개야
관리측면에서 편하기 때문에 사용하는 것 같다.