C#에서 인터페이스(Interface)는 속성, 메서드, 이벤트 등의 멤버를 정의합니다. 다만 인터페이스에는 멤버의 선언만 포함될 뿐, 실제 구현은 이를 상속받는 파생 클래스가 담당합니다.
추상 클래스(Abstract Class)도 유사한 목적으로 사용되지만, 주로 기반 클래스에서 일부 메서드만 선언하고 나머지 기능 구현은 파생 클래스에 맡기고 싶을 때 활용됩니다.
그렇다면 C#에서 추상 클래스와 인터페이스는 정확히 어떤 차이가 있을까요? 핵심적인 차이점을 하나씩 살펴보겠습니다.
1. 상속(Inheritance)
클래스는 여러 개의 인터페이스를 동시에 구현할 수 있지만, 추상 클래스는 단 하나만 상속할 수 있습니다. 이는 C#이 클래스의 다중 상속을 지원하지 않기 때문입니다.
2. 멤버 필드(Member Field)
인터페이스에는 필드(멤버 변수)를 정의할 수 없습니다. 반면 추상 클래스에서는 필드를 자유롭게 선언하고 사용할 수 있습니다.
3. 접근 제한자(Access Modifiers)
인터페이스에는 public, private, protected, internal 같은 접근 제한자를 지정할 수 없습니다. 인터페이스의 모든 멤버는 기본적으로 public으로 간주되기 때문입니다. 반면 추상 클래스에서는 일반 클래스와 마찬가지로 다양한 접근 제한자를 사용할 수 있습니다.
4. 다중 상속(Multiple Inheritance)
추상 클래스를 통해서는 다중 상속을 구현할 수 없습니다. 하지만 인터페이스를 사용하면 하나의 클래스가 여러 인터페이스를 구현함으로써 사실상 다중 상속과 같은 효과를 얻을 수 있습니다.
정리
요약하면, 공통 기능의 일부를 미리 구현해두고 싶다면 추상 클래스가 적합하고, 구현 세부사항 없이 계약(Contract)만 정의하여 유연한 설계와 다중 구현이 필요하다면 인터페이스를 선택하는 것이 좋습니다. 프로젝트의 요구 사항과 확장성을 고려해 적절하게 활용하시기 바랍니다.