인터페이스란,
상속 받을 클래스에 기능이나 속성을 지정하는 역할을 하는 기능이다.
일반적인 상속관계와 같다고 보일 수도 있지만 다른 개념이다.
일단 C#에서는 하나의 부모 클래스만 상속받을 수 있다. 따라서 여러가지 기능들을 사용할 경우
하나의 부모 클래스에서 기능을 상속 받아 자식 클래스에서 정의/사용을 하게 된다.
하지만 이렇게 되면 부모 클래스에 너무나 많은 기능이 들어가게 되어 굉장히 복잡해지고 어지러워질 수도 있다.
이런 상황을 해결해주도록 부모 외에 추가로 상속을 받아 기능을 더 만들 수 있게 해주는 기능이
인터페이스(interface)이다.
상속 관계를 이용하여 히어로를 만든다고 가정해보겠다.
히어로라는 부모 클래스에는 움직임, 달리기, 펀치 같은 히어로가 무조건 가져야 할 기본적인 기능을 만들어두고,
비행 기능, 투명화 기능, 순간이동 기능 등등 추가적인 기능을 인터페이스로 만드는 것이다.
코드 예시
public abstract class BaseHero : MonoBehaviour
{
public virtual void Move()
{
//기본적인 움직임 구현
}
public virtual void Run()
{
//기본적인 달리기 구현
}
public virtual void PunchAttack()
{
//기본적인 펀치 공격 구현
}
}
추상 클래스로 BaseHero라는 클래스를 만들었다. 이 클래스는 다양한 히어로들의 부모가 될 클래스이며,
히어로라면 기본적으로 수행하는 동작들이 virtual 메소드로 구현되어있다.
public interface IFlyable //작명 시 클래스명 앞에 I를 붙여주는게 일반적이다.
{
bool OnFlyMode();
bool OffFlyMode();
}
public interface ITransparentable
{
bool OnTransparentMode();
bool OffTransparentMode();
}
public interface ITeleportable
{
bool OnTeleportMode();
bool OffTeleportMode();
}
인터페이스로 히어로들의 고유한 기능들을 만들어주었다.
비행 모드를 갖고 있는 IFlyable 인터페이스, 순간이동 모드를 갖고 있는 ITransparentable 인터페이스, 텔레포트 모드를 갖고 있는 ITeleportable 인터페이스 이렇게 세가지를 만들었다.
인터페이스는 실제 구현은 하지 않고 이렇게 할 것이다 라는 정의만 한다. 실제 구현은 상속받은 클래스에서 진행한다.
개념적으로는 추상 클래스/메소드와 유사하다.
public class FlyHero : BaseHero, Flyable
{
public bool OffFlyMode()
{
//비행 모드 구현
throw new System.NotImplementedException();
}
public bool OnFlyMode()
{
throw new System.NotImplementedException();
}
public override void Move()
{
base.Move();
}
public override void PunchAttack()
{
base.PunchAttack();
}
public override void Run()
{
base.Run();
}
}
다양한 히어로 중, 비행 기능을 가진 FlyHero 클래스를 만들었다. 이 클래스는 기본적인 기능을 담당하는
BaseHero 클래스와 비행 기능을 정의한 IFlyable 인터페이스를 상속받는다.
(클래스와 다르게 여러가지의 인터페이스를 한번에 상속받을 수도 있다.)
상속받은 인터페이스 메서드를 채워넣기만 하면 비행하는 히어로 하나가 완성된다.
인터페이스의 장점 / 느낀점
1). 객체지향적으로 프로그래밍 하는데에 유리하다.
2). 클래스를 인터페이스로 구분할 수 있다.
예를 들어 IFlyable 인터페이스만 상속받은 히어로들만 함수로 입력을 받고 싶을때 Type을 IFlyable로 하면 해당 클래스에서 ICruiserable이 없는 클래스는 입력을 받을 수 없게 된다.
C#에서는 다중 상속이 불가능하기 때문에 Interface를 잘만 사용한다면 내 프로젝트에 큰 도움이 될 것 같다.
'C# 기초' 카테고리의 다른 글
[C#] dynamic과 default 키워드 (1) | 2023.10.30 |
---|---|
[C#] sealed class (상속 금지)와 partial class (0) | 2023.10.25 |
[C#] 상속 - abstract(추상), virtual(가상) (0) | 2023.10.25 |
[C#] Static 정적 키워드와 확장 메서드 (1) | 2023.10.25 |
[C#] Collections (0) | 2023.10.24 |