1 분 소요

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가 붙어야할 아이템이 많아진다면 그저 인터페이스만 붙여주면 해결됩니다!

인터페이스 사용 및 주의점

클래스는 하나의 부모클래스만 상속할 수 있습니다.
즉, 여러 부모클래스로 부터 상속받을 수 있는 다중상속이 불가능합니다.

인터페이스는 이런 단점을 보완하기 위해 만들어진 개념으로, 클래스는 여러 인터페이스를 상속받을 수 있습니다.

인터페이스를 작성할 때는 아래와같은 주의점이 있습니다.

/**********************/

  1. 인터페이스 이름은 맨앞에 대문자 ‘I’ 를 붙여 구별합니다.

  2. 인터페이스의 선언은 ‘interface’ 키워드를 사용합니다.

  3. 멤버로는 메서드, 프로퍼티, 인덱서 등을 멤버로 가질 수 있습니다.

  4. 멤버는 모두 추상화만 가능합니다. 즉 선언만 가능하며 내용이 있어선 안됩니다.

  5. 추상클래스와 마찬가지로 인스턴스를 생성할 수 없습니다.

/**********************/

또한 인터페이스를 사용할 때는 아래와같은 주의점이 있습니다.

  1. 인터페이스를 상속받은 클래스는 반드시 인터페이스의 멤버를 모두 재정의(오버라이딩) 해야합니다.
  • 인터페이스 사용의 핵심은 다중상속, 그리고 넓고 얕게 연결할 수 있다는 것입니다.

  • 이렇게 연결된 클래스들은 밀점한 관계가 아니므로 변경 및 분리/추가/삭제 하기가 쉬워지며 에러를 일으킬 확률도 줄어들고 유연하게 대처할 수 있는 좋은 방법입니다.

댓글남기기