Game Development, 게임개발/개발

Interface, 인터페이스 [Unity]

게임이 더 좋아 2021. 3. 28. 00:30
반응형
728x170

 

인터페이스는 상속과 비슷하면서도 다른 기능이다.

Java의 interface와 거의 비슷하다고 보면 된다.

보다보면 추상클래스인가? 이 느낌도 날 것이다.

 

알아보자

 


 

역시 정의부터 해보자.

 

인터페이스는 뜻을 해석해보면 알겠지만 상호간의 소통을 위한 매개체랄까 그런 것이다.

여기선 "인터페이스로 내가 정의한 것들을 너는 상속을 받아서 무조건 구현해야 한다. "는 그런 의무가 생긴다.

++ 인터페이스에 구현된 것을 상속 받은 자식클래스가 구현하지 않으면 오류가 생김

++ 추상클래스는 다중 상속이 안되지만 인터페이스는 다중 상속 가능

 


 

 

상속과 비슷하지만 다른 것이 무엇이냐?

바로 클래스 간의 관계가 다르다.

밑의 그림을 보면 쉽게 알 수 있다.

 

Implements는 여기서 구현이라고 생각하면 되겠다.

 

또한 interface는 네임 컨벤션, Name Convention이 있어 첫 글자를 대문자 I 로하는 것이 암묵적인 룰이다. 그 뒤에오는 문자 또한 대문자로 시작하게 한다.

**그래야 인터페이스로 I인지 진짜 I로 시작하는 메서드인지 구분한다.

 

 

또한 클래스 선언과 비슷해보이지만

인터페이스는 메서드, 이벤트, 프로퍼티 등만 가질 수 있다.

접근 제한자도 없어서. 무조건 public으로 선언된다. 

++public 선언 안해도 인터페이스에서는 public으로 받아들인다.

++인스턴스 생성도 안된다.

 

 

인터페이스를 상속받아 이용하는데

상속받은 자식클래스는 반드시 인터페이스에 있는 모든 메서드를 구현해야 한다.

++이 메서드도 public 으로 선언되어야 한다.

 

**이것도 상속받은 거니까 재정의하려면 override를 선언해야하나????

-> 아니다. 인터페이스는 override를 선언할 필요가 없다. 그냥 정의하자.

 

 

**짧게 말하면 인터페이스에서는 구조, 형태를 만들고 실제 클래스에서 구현을 한다고 보면 된다.

 

 

예시를 보면서 이해하자

 

Interface

using UnityEngine;
using System.Collections;

//하나의 메서드를 인터페이스하는 것
public interface IKillable
{
    void Kill();
}

//제너릭 인터페이스이다. 
// T는 어떤 클래스가 받아서 실행하느냐에 따라 달렸다.
public interface IDamageable<T>
{
    void Damage(T damageTaken);
}

 

Avartar

using UnityEngine;
using System.Collections;

public class Avatar : MonoBehaviour, IKillable, IDamageable<float>
//원래는 다중 상속이 안되지만 인터페이스로 바꿔서 다중 인터페이스하게 만들었다.
{
    //구현하면 된다.
    public void Kill()
    {
        //Do something fun
    }

    //타입이 정해졌으니 구현하면 된다.
    public void Damage(float damageTaken)
    {
        //Do something fun
    }
}

** 하나의 클래스가 여러 개의 클래스를 상속은 못받지만 인터페이스를 상속받는 것은 가능.

 

 


 

참고링크

learn.unity.com/tutorial/interfaces

반응형
그리드형