유니티(Unity) 인터페이스(Interface) 완전 쉽게 설명 / DI원칙

인터페이스란?

예를 들어, 우리가 컴퓨터 키보드에 글자를 입력하면, 키보드는 글자를 컴퓨터로 전달합니다. 이때 키보드와 컴퓨터 사이의 인터페이스는 키보드의 물리적 디자인과 컴퓨터가 키 입력을 이해하는 프로그램 사이의 연결 역할을 합니다. 그 덕분에 우리가 타이핑하는 순간 글자가 화면에 나타나게 되는 것입니다.
 
아직 이해가 제대로 되지 않으셔도 괜찮습니다.
아래  "햄버거"를 예시로 쉽게 인터페이스에 대해 다시 설명드리겠습니다.
 


햄버거 만들기

햄버거를 만드는 스크립트를 작성한다고 생각해 봅시다.
우리는 다음  4개의 스크립트가 필요할 것입니다. (물론, 더 많이 존재할 수 있겠지만 대략적인 틀만 잡아 보기 위해 4개의 스크립트만 준비했습니다. 모든 코드는 수도코드 형식으로 작성되었습니다.)
 

  1. 햄버거 레시피 (인터페이스)
  2. 햄버거를 만드는 요리사
  3. 햄버거
  4. 햄버거를 주문하는 고객

 


햄버거 레시피 인터페이스

public interface HamburgerRecipe
{
    void NewHamburgerRecipe();
}

 
햄버거를 만들 때 레시피 없이 만드는 햄버거 브랜드가 존재할까요?
레시피 없이 햄버거를 만들면 여러분은 군대리아 버거맛을 느낄 수 있습니다..

군데리아..

맛있는 햄버거를 만들기 위해선 햄버거 레시피가 필요한데,
레시피인터페이스라고 생각하면 됩니다.
 
정석 레시피에는 재료, 햄버거 이름, 요리 과정 등이 들어가 있겠지만,
저희는 실제로 햄버거를 만드는 과정이 아니므로 대략적인 레시피형태(NewHamburgerRecipe)만 갖추겠습니다.
 
(원래대로면 아래 사진처럼 해야겠죠?)

햄버거 레시피 with GPT

 
저희는 햄버러 레시피를 상속받게 되면 앞으로 새로운 햄버거를 만들어 낼 수 있는 NewHamburgerRecipe을 얻게 되었습니다!
 


햄버거 레시피를 보고 햄버거를 만들 요리사

using UnityEngine;

public class Chef : MonoBehaviour
{
    private HamburgerRecipe _recipe;

    public Chef(HamburgerRecipe recipe)
    {
        _recipe = recipe;
    }

    public void MakeBurger()
    {
        Debug.Log($"{_recipe}만드는중");
    }
}

다음으로, 햄버러 레시피를 보고 햄버거를 만들 요리사입니다.
 
요리사는 햄버거 레시피를 보고 햄버거를 만들어야 하므로 생성자에서 레시피를 파라미터로 받습니다.
그다음, MakeBurger 함수를 이용해서 햄버거를 만들 수 있습니다.
 


햄버거

using UnityEngine;

public class CheezeBurger : MonoBehaviour, HamburgerRecipe
{
    public void NewHamburgerRecipe()
    {
        Debug.Log("나는 치즈버거!!!");
    }
}

햄버거에는 참 다양한 종류들이 존재합니다. 치즈 버거, 불고기 버거, 야채 없는 버거
여러분은 어떤 햄버거를 좋아하시나요?
 
이번 포스팅에서는 치즈 버거를 예시로 들겠습니다.
치즈 버거는 햄버거 레시피를 상속받습니다.
 
NewHamburgerRecipe에 적혀 있는 것을 참고해서 치즈 버거를 만들어야 하기 때문입니다.
 
NewHamburgerRecipe 함수를 통해 우린 치즈 버거를 만들 수 있게 되었습니다.


햄버거를 주문하는 손님

using UnityEngine;

public class Customer : MonoBehaviour
{
    private Chef chef;
    
    private void Start()
    {
        //손님이 셰프에게 치즈버거 만들어달라고 요청하는 로직
        //새로운 버거가 생길때마다 class만들면 될 뿐
        chef = new Chef(new CheezeBurger());
        chef.MakeBurger();
    }
}

마지막으로, 햄버거를 주문하는 손님입니다.
 
손님은 햄버거를 만들어줄 Chef가 필요하므로 Chef를 선언해 줍니다.
 
그다음, Chef에게 원하는 햄버거 종류를 주문하면 됩니다.
 
손님 코드에서 인터페이스를 활용했기에 얻을 수 있는 장점을 볼 수 있습니다. 
 


인터페이스 장점

 

 

햄버거를 주문하는 고객

소비자가 원하는 햄버거를 주문한다고 생각해 봅시다.
 

if(치즈버거)
else if(불고기버거)
else(야채없는버거)

가장 쉽게 코드를 작성하는 방법은 위와 같은 방식입니다.
하지만, 새로운 버거가 추가될 때마다 코드를 수정해주어야 하기에 SOLID 원칙을 지키지 못하는 모습을 보이게 됩니다.
 


chef = new Chef(치즈버거);
chef.MakeBurger();

 
하지만, 인터페이스를 활용하게 된다면 위와 같이 Chef에게 원하는 종류의 버거를 넘기기만 하면 되는 겁니다.
 
이제 우리는 더 이상 이 코드를 수정할 필요가 없어졌으므로 SOLID원칙에서 O와 D를 지킬 수 있게 된 것입니다.
 

얏호!!!