인터페이스는 비추상 클래스 또는 구조체가 구현해야하는 관련 기능에 대해 정의한다.
즉 클래스의 형태만 정의하고 구현하지는 않고 이는 상속 클래스에서 구현해야한다.
어떠한 작은 기능에 대한 정의를 할 때 인터페이스를 상속 받는다.
public interface IDamageable
{
void TakeDamage(int amount);
}
public class Enemy : IDamageable
{
public void TakeDamage(int amount)
{
// 실제 데미지 로직
health -= amount
}
}
인터페이스는 다중상속이 가능하여 여러 인터페이스를 하나의 클래스에서 상속 가능하다.
하지만 변수, 생성자를 선언할 수 없다.
또한 메서드의 기본 동작을 구현할 수 없다.
그렇기에 인터페이스는 동일한 동작으로 하는 클래스, 다중 상속이 필요할 때 사용한다.
public abstract class Shape
{
private int _id;
public Shape(int id)
{
_id = id;
}
public abstract double Area { get; }
}
public class Square : Shape
{
private int _side;
public Square(int id, int side) : base(id)
{
_side = side;
}
public override double Area
{
get { return _side * _side; }
}
}
public class Circle : Shape
{
private int _radius;
public Circle(int id, int radius) : base(id)
{
_radius = radius;
}
public override double Area
{
get { return _radius * _radius * Math.PI; }
}
}
추상 클래스는 다중상속이 불가능하다.
인터페이스와 다르게 필드와 생성자를 선언할 수 있고
추상 메서드와 일반 메서드를 둘다 선언/ 구현할 수 있다.
또한 추상 메서드는 자식클래스에서 반드시 override로 구현해야한다.
추상 클래스는 공통 로직과 기본 구현이 필요할 때 사용한다.