⭐ 인터페이스
구현이 없는 메서드, 속성의 집합입니다. 상속을 통해 사용이 가능하며, 다중 상속이 가능합니다.
💡 인터페이스와 추상 클래스는 닮았다.
● 인터페이스를 상속 받는 자식 클래스들은 반드시 인터페이스의 함수나 프로퍼티를 재정의 해야합니다.
● 인터페이스 자체로는 인스턴스를 만들 수 없습니다.
● 인터페이스 내의 메서드는 선언만 가능합니다. (구현이 불가능함)
💡 추상 클래스와 다른 점
● 인터페이스는 다중 상속을 지원합니다.
● 인터페이스의 메서드는 접근한정자를 사용하지 못합니다. (기본적으로 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를 만들면 사용 불가능한 아이템도 상속받습니다.
○ 인터페이스를 사용하면
■ 아이템이 아무리 많아도 인터페이스 상속 여부에 따라 판단이 가능합니다.
■ 간단한 로직을 통해 체크 가능 = 효율적
'개발, IT > C#' 카테고리의 다른 글
| [유니티 / C#] 제네릭 (Generic) (0) | 2025.09.19 |
|---|---|
| [유니티 / C#] 박싱(Boxing), 언박싱(Unboxing) (0) | 2025.09.19 |
| [유니티 / C#] 추상(abstract) 클래스 (0) | 2025.09.19 |
| [유니티 / C#] 클래스의 상속(Inheritance) (0) | 2025.09.18 |
| [유니티 / C#] static (정적) 한정자 (0) | 2025.09.17 |