공통된 기능을 함수로 만들어둔 추상적인 모음.
interface IMoveable
{
public void Move(); //만들어야하는 함수를 선언
}
interface IFlyable
{
public void Fly(); //구현해라 라는 의미. 구현하면 안됌.
}
클래스에 적용하려면
class Pigeon : Animal, IFlyable
{
public override void Eat() { }
public void Fly() { }
}
상속하듯이 적용하면된다.
특이한 점으로는
클래스 상속은 두개이상 상속이 안되지만
class Pigeon : Animal, IFlyable, IMoveable
{
public override void Eat() { }
public void Move() { }
public void Fly() { }
}
두가지 이상도 가능하다.
또한
interface IFlyable : IMoveable
{
public void Fly(); //구현해라 라는 의미. 구현하면 안됌.
}
인터페이스에도 상속처럼 가능하다.
하나의 클래스는 하나의 역할만 해야한다. (이 클래스가 여러가지의 일을 하는가? 를 체크해야한다.)
확장에는 개방 되어있고, 수정에는 닫혀있어야한다.
기능을 추가할 일이 생겼을 경우, 기본 코드는 최대한 수정하지 않아야 한다.
부모 타입 자리에 자식 객체를 넣어도 동작해야한다.
( 업캐스팅, 다운캐스팅 )
interface IMonster //이런식으로 크게 만들지마라.
{
public void Move();
public void Attack();
}
위 처럼 인터페이스를 한번에 구성하지 말고, 기능별로 따로 정리해서 만들어야한다.
구체적 요소(객체 / 클래스)에 의존하지말고, 추상적인 것에 의존 해야한다.
public Sword sword; // 객체를 나열하는 것이 아니라
IWeapon weapon; // 인터페이스를 활용
abstract나 interface를 잘 활용하여서 추상적으로 만들어놔야 나중에 코드를 관리하기가 좋다.