// 이동 가능한 기능 인터페이스
public interface IMovable
{
void Move();
}
// 공격 가능한 기능 인터페이스
public interface IAttackable
{
void Attack();
}
// 대화 가능한 기능 인터페이스
public interface ITalkable
{
void Talk();
}
// 플레이어 클래스 - 3개의 인터페이스를 모두 구현
public class Player : IMovable, IAttackable, ITalkable
{
public string Name { get; set; }
public Player(string name)
{
Name = name;
}
public void Move()
{
Console.WriteLine($"{Name}이(가) 앞으로 달려갑니다.");
}
public void Attack()
{
Console.WriteLine($"{Name}이(가) 검으로 공격합니다!");
}
public void Talk()
{
Console.WriteLine($"{Name}이(가) 마을 사람과 대화를 시작합니다.");
}
}
// 사용 예시
public static void Main()
{
Player player = new Player("용사");
// 각각의 기능을 인터페이스 기준으로 수행
player.Move(); // 이동
player.Attack(); // 공격
player.Talk(); // 대화
}
>>>용사이(가) 앞으로 달려갑니다.
>>>용사이(가) 검으로 공격합니다!
>>>용사이(가) 마을 사람과 대화를 시작합니다.
IMovable, IAttackable, ITalkable 등의 각 기능을 인터페이스를 구현하고 클래스에서 여러 개의 인터페이스를 상속하여 사용 가능
기능 구현을 강제하는 것으로는 추상 클래스(abstract class)도 있는데,
그렇다면 추상 클래스와 차이점은 뭘까?
| 항목 | 추상 클래스 (abstract class) | 인터페이스 (interface) |
|---|---|---|
| 키워드 | abstract class 클래스명 | interface 인터페이스명 |
| 상속 개수 | 단일 상속만 가능 | 다중 구현 가능 (,로 여러 개 구현 가능) |
| 멤버 구성 | 필드, 생성자, 구현 메서드, 추상 메서드 등 포함 가능 | 추상 메서드만 정의 |
| 접근 제한자 | public, protected, private 등 사용 가능 | 기본적으로 모든 멤버는 public |
| 생성자 | 생성자 가질 수 있음 | 생성자 없음 |
| 사용 목적 | 기본 동작 제공 + 자식 클래스에 일부 강제 | 구현 강제 / 기능 명세 제공 (역할 부여) |
| 대표적 사용 예 | 공통 로직 + 일부만 자식이 다르게 구현할 때 | 다중 역할 부여가 필요할 때 (플러그인, 이벤트 등) |
추상 클래스 = 공통 기반을 제공하고, 자식 클래스에서의 확장이 필요하다면
인터페이스 = 다양한 클래스에 특정 역할이나 기능을 강제로 부여하고 싶다면