[유니티 / C#] 인터페이스 (Interface)

⭐ 인터페이스

구현이 없는 메서드, 속성의 집합입니다. 상속을 통해 사용이 가능하며, 다중 상속이 가능합니다.

 


 

💡 인터페이스와 추상 클래스는 닮았다.

 

● 인터페이스를 상속 받는 자식 클래스들은 반드시 인터페이스의 함수나 프로퍼티를 재정의 해야합니다.

● 인터페이스 자체로는 인스턴스를 만들 수 없습니다.

● 인터페이스 내의 메서드는 선언만 가능합니다. (구현이 불가능함)

 


 

💡 추상 클래스와 다른 점

 

● 인터페이스는 다중 상속을 지원합니다.

● 인터페이스의 메서드는 접근한정자를 사용하지 못합니다. (기본적으로 public으로 지정되어 있음)

● 인터페이스는 멤버 변수를 가지지 못합니다.

 

 

⭐ 인터페이스 사용하기

//인터페이스 선언
public interface IUsable
{
    void Use();
}

 

● 먼저 사용가능한 아이템에 상속할 IUsable 인터페이스를 선언합니다.

● 단 인터페이스의 메서드는 선언만 가능

 

 

 

public abstract class Item
{
    public string name;
    public int id;
}

public class Potion : Item, IUsable
{

    public void Use()
    {
        Console.WriteLine("회복!");
    }
}

public class Bomb : Item, IUsable
{
    
    public void Use()
    {
        Console.WriteLine("붐!");
    }
}

public class Gem : Item
{
    public void Use()
    {
        Console.WriteLine("젬!!");
    }
}

 

● 여러 아이템들의 부모가 될 Item 클래스를 정의합니다.

    ○ Item 클래스를 상속받을 각각의 아이템 클래스들을 정의합니다.

    ○ Potion, Bomb 클래스 = IUsable 인터페이스 상속, Gem = 인터페이스 상속 x

 

 

 

public class Inventory
{
    public void UseItem(Item item)
    {
        //인자값으로 받은 item변수가 IUsable을 상속받는지 체크
        if(typeof(IUsable).IsAssignableFrom(item.GetType()))
        {
            IUsable useable = item as IUsable;
            useable.Use();
        }
        else
        {
            Console.WriteLine("사용 불가능 아이템!");
        }
    }
}

//단순 출력을 위해 간단하게 구현함
internal class Program
{
    static void Main(string[] args)
    {
        Potion potion = new Potion();
        Bomb bomb = new Bomb();
        Gem gem = new Gem();

        Inventory inventory = new Inventory();

        inventory.UseItem(potion);
        inventory.UseItem(bomb);
        inventory.UseItem(gem);
    }
}

 

● Inventory 클래스에서 Iusable 인터페이스만 상속받고 있는 아이템들을 체크 가능

    ○ 인터페이스를 상속받고 있으면 Iusable.Use() 실행

    ○ 상속받고 있지 않으면 "사용 불가능 아이템!" 문구 출력


⭐ 인터페이스를 사용하는 이유

● 위의 Item 클래스를 이용해 수백 개의 아이템을 만든다 했을 때

    ○ 인터페이스를 사용하지 않으면

        ■ 아이템이 수십개, 수백개일 때 일일이 각 클래스에 접근하여 Use 메서드를 호출해야 합니다.

        ■ 굉장히 비효율적, 그렇다고 Item 클래스에 Use를 만들면 사용 불가능한 아이템도 상속받습니다.

 

    ○ 인터페이스를 사용하면

        ■ 아이템이 아무리 많아도 인터페이스 상속 여부에 따라 판단이 가능합니다.

        ■ 간단한 로직을 통해 체크 가능 = 효율적