인터페이스 ( Interface )
객체지향 프로그래밍에서 중요한 설계 개념 중 하나.
"어떻게 동작하는지는 몰라도, 무엇을 할수 있는지"만 알면 된다.
인터페이스는 구현 ( Implementation )을 포함하지 않고, 멤버의 시그니처 ( signature )만 정의한다.
클래스나 구조체는 :인터페이스명 을 통해 이를 구현 ( Implement ) 해야 한다.
인터페이스는 "클래스가 따라야 할 약속 또는 규칙"이다.
- 인터페이스는 속성 , 메서드 , 이벤트 , 인덱서의 선언 ( signature )만 포함한다.
- 실제 구현은 인터페이스를 상속받은 클래스가 한다.
문법
▼인터페이스 정의
public interface IAttackable
{
void Attack(); // 메서드 시그니처
int Damage { get; set; } // 프로퍼티 시그니처
}
▼인터페이스 구현
public class Warrior : IAttackable
{
public int Damage { get; set; }
public void Attack()
{
Console.WriteLine($"전사가 {Damage}의 피해를 입혔습니다!");
}
}
IAttackable 은 "공격할 수 있는 무언가" 라는 개념이다.
Warrior 는 그 규칙을 따라 구현을 제공하는 클래스이다.
특징
- 다중 상속이 불가능한 ㅋ르래스와 달리, 여러 인터페이스를 동시에 구현할 수 있다.
- 인터페이스의 모든 멤버는 기본적으로 public 이며 접근 제한자를 따로 붙이지 않는다.
- 인터페이스는 인스턴스화 불가하다. ( new IAttackable() )
- 인터페이스끼리도 상속이 가능하다.
다중 인터페이스 예시
// ▼첫 번째 인터페이스
public interface IAttackable
{
void Attack();
}
// ▼두 번째 인터페이스
public interface IHealable
{
void Heal();
}
// ▼클래스가 여러 인터페이스를 구현
public class Paladin : IAttackable, IHealable
{
public void Attack()
{
Console.WriteLine("팔라딘이 검으로 공격합니다!");
}
public void Heal()
{
Console.WriteLine("팔라딘이 아군을 치유합니다!");
}
}
class Program
{
static void Main(string[] args)
{
Paladin p = new Paladin();
// ▼IAttackable 역할
p.Attack();
// ▼IHealable 역할
p.Heal();
// ▼다형성 활용
IAttackable attacker = p;
attacker.Attack();
IHealable healer = p;
healer.Heal();
}
}
클래스는 : 뒤에 여러 인터페이스를 , 로 구분해 구현할 수 있다.
이렇게 하면 하나의 객체가 여러 역할 ( 공격 , 치유 ) 을 동시에 수행할 수 있다.
다형성을 통해 특정 인터페이스 타입으로 참조하면, 그 역할에 맞는 동작만 보장된다.
주의 사항
- 구현 클래스는 인터페이스에 정의된 모든 멤버를 반드시 구현해야 한다.
- 인터페이스를 변경하면 이를 구현하는 모든 클래스에도 영향을 주므로 설계 시 신중해야 한다.
인터페이스 사용 이유
- 기능 보장 : 클래스가 어떤 인터페이스를 구현했다는 것은, 특정 기능을 반드시 제공한다는 의미
- 유연한 설계 : 다양한 타입을 같은 방식으로 다룰 수 있다 ( 다형성 )
- 느슨한 결합 : 인터페이스만 바라보고 코드를 작성하면 구현체가 변경되어도 문제 없다
인터페이스 vs 추상클래스
| 구분 | 인터페이스 | 추상클래스 |
| 목적 | 동작의 규칙 정의 | 동작의 틀 + 기본 구현 제공 |
| 다중 상속 | 가능 | 불가능 |
| 필드 선언 | 불가능 | 가능 |
| 생성자 | 없음 | 있음 |
| 구현된 메서드 | (C# 8.0) 이전에는 불가능 | 가능 |
정리
인터페이스는 클래스 / 구조체가 반드시 따라야 할 약속을 정의하는 설계도이다.
참고 자료
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/interface
'⭐C Sharp > 11. 객체 지향' 카테고리의 다른 글
| 상속 ( OOP ) (0) | 2025.09.28 |
|---|---|
| 추상 클래스 ( Abstract Class ) (0) | 2025.09.28 |
| this ( 매개변수 키워드 ) (0) | 2025.09.28 |
| 클래스 ( Class ) (0) | 2025.09.22 |
| 메모리 구조 (0) | 2025.09.22 |