1. 개념 설명
인터페이스는 타입이 수행해야 할 계약을 정의합니다. 메서드 시그니처만 제공하며 구현과 상태는 없습니다. 반면 추상 클래스는 일부 공통 구현과 상태를 갖고, virtual/abstract 멤버로 확장 지점을 노출합니다. 상속은 하나만 가능하지만 인터페이스는 여러 개를 구현할 수 있어 역할 조합에 유리합니다.
2. 코드 예제
아래 예제는 추상 클래스의 기본 구현과 인터페이스 계약을 함께 사용하는 방법입니다.
using System;
public interface ILogger
{
void Log(string msg);
}
public abstract class Worker
{
public abstract void Work();
public void Greet() => Console.WriteLine("안녕하세요, Worker 입니다.");
}
public class Developer : Worker, ILogger
{
public override void Work()
{
Console.WriteLine("코딩 중입니다.");
}
public void Log(string msg)
{
Console.WriteLine($"LOG: {msg}");
}
}
public static class Program
{
public static void Main()
{
Worker w = new Developer();
w.Greet();
w.Work();
ILogger logger = (ILogger)w;
logger.Log("작업 완료");
Console.WriteLine(w is ILogger);
}
}
기본 메서드 Greet는 추상 클래스에서 제공되고, Work는 파생 클래스가 재정의합니다. ILogger로 캐스팅해 계약을 통해 호출하며 마지막 줄은 인터페이스 구현 여부를 출력합니다.
3. 주의사항/팁
공통 상태와 재사용 가능한 로직이 있다면 추상 클래스를, 단순한 역할 규약이라면 인터페이스를 선택합니다. 인터페이스 변경은 파급이 커서 신중히 버전 관리해야 합니다(C# 8의 기본 인터페이스 메서드는 남용 주의). 다중 상속이 불가하므로 복합 역할은 인터페이스로 조합하고, 템플릿 패턴이 필요할 땐 추상 클래스를 사용합니다. 테스트에서는 인터페이스가 목킹과 대체 구현 주입에 유리합니다.
'C#' 카테고리의 다른 글
| C# 예외 처리 try-catch-finally (0) | 2026.04.03 |
|---|---|
| C# Dictionary와 HashSet 활용 (0) | 2026.04.02 |
| C# 속성 (Properties)과 자동 속성 (0) | 2026.04.01 |
| C# 확장 메서드 (0) | 2026.04.01 |
| C# 델리게이트와 이벤트 (0) | 2026.03.31 |