유니티 인터페이스(Interface)의 사용
Intro
-
게임을 개발하다보면 어떤 아이템이나 캐릭터등이 공통적인 기능, 특징들을 가질때가 있습니다.
-
인터페이스는 이런 공통부분들을 관리할 수 있는 기능입니다.
인터페이스를 사용하는 상황
-
예를들어, Use() 라는 함수가 있다고 생각해봅니다. 이 함수는 어떤 아이템을 사용하는 함수입니다.
-
플레이어가 체력포션을 먹고, 마나포션도 먹고, 또 다른 여러 소모성아이템을 사용하는 상황이 있을겁니다.
-
그러면 여러가지 Use 함수를 만들어야할것입니다.
-
이럴 때 유용하게 사용되는것이 인터페이스입니다.
IUsable.cs
- IUsable 인터페이스는 아이템을 사용하는 함수 Use()가 들어있습니다.
public interface IUsable
{
void Use(); // 아이템 사용
}
-
코드를 살펴보면, class 대신에 interface라는 키워드가 사용되었고, 그 안에는 내용이없는 Use() 함수가 있습니다.
-
그렇다면 이 간단해보이는, 아무것도없는것을 어떻게 사용하는걸까요?
인터페이스 상속 및 재정의
- 예를들어 포션아이템 스크립트가 하나 있다고 생각해봅니다.
public class PortionItem : Monobehavior, IUsable // 1. 인터페이스 상속
{
public int amount = 100; // 회복량
public void Use() // 2. 오버라이팅
{
Debug.Log("체력을 100 회복합니다!");
Player player = FindObjectOfType<Player>();
player.health += amount;
gameObject.SetActive(false);
}
}
-
작성한 인터페이스를 사용하기 위해서 포션아이템 스크립트에 IUsable 인터페이스를 상속시킵니다.
-
그 후 반드시 상속시킨 인터페이스의 함수 Use()를 재정의(오버라이딩) 해야합니다.
-
그렇지 않으면 에러가발생하게 됩니다.
-
상속시키고, 함수를 작성하는것만으로 포션을 사용할 수 있게되었습니다. 만약 Use가 붙어야할 아이템이 많아진다면 그저 인터페이스만 붙여주면 해결됩니다!
인터페이스 사용 및 주의점
클래스는 하나의 부모클래스만 상속할 수 있습니다.
즉, 여러 부모클래스로 부터 상속받을 수 있는 다중상속이 불가능합니다.
인터페이스는 이런 단점을 보완하기 위해 만들어진 개념으로, 클래스는 여러 인터페이스를 상속받을 수 있습니다.
인터페이스를 작성할 때는 아래와같은 주의점이 있습니다.
/**********************/
-
인터페이스 이름은 맨앞에 대문자 ‘I’ 를 붙여 구별합니다.
-
인터페이스의 선언은 ‘interface’ 키워드를 사용합니다.
-
멤버로는 메서드, 프로퍼티, 인덱서 등을 멤버로 가질 수 있습니다.
-
멤버는 모두 추상화만 가능합니다. 즉 선언만 가능하며 내용이 있어선 안됩니다.
-
추상클래스와 마찬가지로 인스턴스를 생성할 수 없습니다.
/**********************/
또한 인터페이스를 사용할 때는 아래와같은 주의점이 있습니다.
- 인터페이스를 상속받은 클래스는 반드시 인터페이스의 멤버를 모두 재정의(오버라이딩) 해야합니다.
-
인터페이스 사용의 핵심은 다중상속, 그리고 넓고 얕게 연결할 수 있다는 것입니다.
-
이렇게 연결된 클래스들은 밀점한 관계가 아니므로 변경 및 분리/추가/삭제 하기가 쉬워지며 에러를 일으킬 확률도 줄어들고 유연하게 대처할 수 있는 좋은 방법입니다.
댓글남기기