Interface 문법에 대한 정리이다.
인터페이스는 클래스가 구현해야 할 기능의 목록만 정의하는 일종의 약속 이다.
- 인터페이스는 구현이 아니라 형태만 가지고 있다.
- 메서드나 프로퍼티의 이름, 반환값, 인자만 정하고 로직은 정의하지 않는다.
예시코드
public interface IDamagealbe // 인터페이스 이름 앞에는 보통 I를 쓴다.
{
void TakeDamage(int damage);
}
IDamageable는 "나는 데미지를 받을 수 있다" 라는 기능을 갖고 있는 객체 라고 명시하는 것이다.
모든 일에는 이유가 필요하다. 왜 사용해야 하는지 알아보자.
- 유연한 구조 설계
- 서로 다른 클래스들이 공통 기능을 가지고 있어도, 상속 없이 구현 가능하다.
- 적,플레이어 오브젝트 모두 데미지를 받을 수 있다면 -> IDamageable 인터페이스를 구현하면 된다.
- 느슨한 결합
- 다형성을 극대화해서 구체 클래스가 아닌 인터페이스에 의존하도록 만든다.
- 테스트에 용이하다.
- 서로 다른 객체가 같은 기능을 해야 할 때. (공통 인터페이스로 통일 가능)
- 여러 클래스에게 동일한 책임을 줄 때. (상속보다 더 유연하게 관리 가능)
- 게임 오브젝트에 상호작용 기능을 붙일 때. (IInteractable 같은 패턴이 자주 등장)
- 행동을 외부에서 제어해야 할 때. ( 인터페이스 기반으로 전달하고 호출)
Unity에서 자주 쓰이는 예시
(데미지 입기, 상호작용, 이동 가능, 공격 가능, 프레임 또는 시간마다 동작)
Unity에서도 제공하는 인터페이스들이 존재한다.
IPointerClickHandler
IDragHandler
IBeginDragHandler / IEndDragHandler
IAnimationEventReceiver
이름을 보면 어떤 기능을 가지고 있을지 예상 되지만, 필요할 때 검색해서 사용하자.
마지막으로 짧은 예시
public interface IInteractable
{
void Interact();
}
public class NPC : MonoBehaviour, IInteractable
{
public void Interact()
{
Debug.Log("NPC와 대화합니다.");
}
}
public class Chest : MonoBehaviour, IInteractable
{
public void Interact()
{
Debug.Log("상자를 엽니다.");
}
}
구현 강제성, 복잡성 같은 단점이 존재 하지만, 사용법만 잘 숙지하고 능숙해 진다면 활용 방법이 무궁무진 할 것 같다. 상속과 비슷한 개념이 몇가지 존재 하는거 같다. 다음엔 상속에 대한 개념을 정리해 차이점을 정확히 알아보자.
인터페이스를 잘 사용하면 좋을 것 같다는 말에 공감 백번합니다!