본문 바로가기

C#

C# 인터페이스와 추상 클래스 비교

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