개발/C#

[C#] 인터페이스(Interface)

남생이야 2024. 5. 14. 00:59

  인터페이스는 추상 클래스와는 다르게 구현을 포함할 수 없다. 즉, 어느 멤버라도 함수에 대한 정의를 할 수는 없고 이름 명시만 할 수 있게 된다. 

 더불어서, 인터페이스는 다중 상속을 허용한다. 인터페이스는 개발자에게 앞으로의 기능을 구현할 것이라는 '가능성'을 알려주기 위해 사용한다. 

 

 인터페이스가 가질 수 있는 것은 

상수
추상 프로퍼티 
추상 메소드 

 

위와  같은 값만 가질 수 있으며, 인터페이스의 멤버는 기본적으로 public이다. 

 

public interface IDamagable
{
    void Damage(GameObject attacker, IWeapon causer, float power);
}

 

데미지를 받을 수 있는 객체들에게 붙일 인터페이스를 정의한다. 

 

  아래 코드는 EnemyBT 클래스에  IDamagable 인터페이스를 상속 받고 인터페이스의 멤버 함수(메소드)인 Damage 함수를 정의하여 사용하고 있다. 

public partial class EnemyBT : MonoBehaviour, IDamagable
{

 public void Damage(GameObject attacker, IWeapon causer, float power)
 {
     status.Damage(power);

     if (status.Dead == false)
     {
         animator.SetTrigger("Damaged");

         // 이미 대상이 있으면 갱신하지않는다. 
         // TODO: 도발에 대한 개념이 추가되면 여기 수정
         if (target == null)
         {
             // 나를 공격한 녀석을 바로 타겟으로 잡는다.
             Debug.Log("Somebody Hittd me");
             target = attacker;
         }

         return;
     }

     animator.SetTrigger("Dead");

     Collider collider = GetComponent<Collider>();
     collider.enabled = false;
     GameManager.Instance.monsterCount--;
     Destroy(this.gameObject, 5.0f);
 }

}

 

 

위와 같은 데미지를 입을 수 있는 객체를 참조하기 위하여 상속받아 정의된 클래스만을 참조하는게 아닌 

   IDamagable damagable = other.GetComponent<IDamagable>();

위와 같은 코드로 인터페이스에 접근하여 판단을 내릴 수 있다.