인터페이스 실제 사용했을때의 이점

2024. 10. 31. 13:00카테고리 없음

인터페이스 사용의 이점

인터페이스는 여러 클래스에서 공통적인 기능을 정의해둘 수 있는 강력한 도구이다. 인터페이스의 특정 기능만 필요할 때, 인터페이스 타입을 통해 클래스의 세부 구현에 의존하지 않고 기능만 호출할 수 있다.

쉽게 말해, 인터페이스가 선언되지 않은 다른 클래스에서도 인터페이스에 선언된 함수만을 손쉽게 사용할 수 있는 방법이다.

코드

인터페이스 선언

public interface IDamagalbe
{
    void TakePhysicalDamage(int damage);
}

클래스에서 인터페이스를 선언하지 않고 사용

public class CampFire : MonoBehaviour
{
    public int damage;
    public float damageRate;
    
    List<IDamagalbe> things = new List<IDamagalbe>();
    void Start()
    {
        //얼만큼의 데미지텀을 줄것인지 결정하는 곳
        InvokeRepeating("DealDamage", 0, damageRate);
    }

    void DealDamage()
    {
        for (int i = 0; i < things.Count; i++)
        {
            things[i].TakePhysicalDamage(damage);   //불에 닿으면 데미지 주는 곳
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.TryGetComponent(out IDamagalbe damagalbe))
        {
            things.Add(damagalbe);
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.TryGetComponent(out IDamagalbe damagalbe))
        {
            things.Remove(damagalbe);
        }
    }
}

코드 설명

CampFire 클래스는 IDamagalbe를 사용해 불에 닿은 모든 객체에 데미지를 줍니다. 이때 IDamagalbe를 구현하지 않은 객체라면 리스트에 추가되지 않기 때문에 안전하게 데미지 기능만 호출할 수 있습니다.

 

더 자세히 말하자면

out IDamagalbe damagalbe 을 사용한 이유는 해당 컴퍼넌트에 IDamagalbe이 있으면 그 해당 인터페이스에 관한 내용을 damagalbe에 저장을 하고 리스트에 추가를 한다. 이떄 damagalbe에 들어가있는 정보는 부딪친 컴퍼넌트에 IDamagalbe이 있으면 그 스크립트안에 있는 TakePhysicalDamage(int damage); 함수를 가져올 수 있는거다.