C# 프로그래밍에서 인터페이스(Interface)와 클래스(Class)는 객체 지향 설계의 핵심 요소이지만, 그 역할과 특성은 확연히 다릅니다. 두 개념을 정확히 이해하면 더 유연하고 유지보수하기 좋은 코드를 작성할 수 있습니다.
인터페이스는 필드나 메서드 구현부가 없는 일종의 '설계 규격'입니다. 즉, 스스로 정의한 메서드를 직접 구현할 수 없으며, 오직 멤버의 선언만 포함합니다. 반면 클래스는 인터페이스에 선언된 메서드를 실제로 구현하는 역할을 담당합니다.
인터페이스(Interface)란?
인터페이스는 속성(Property), 메서드(Method), 이벤트(Event) 등의 멤버를 정의하지만, 이들에 대한 선언만 포함할 뿐 실제 구현 코드는 담고 있지 않습니다. 인터페이스를 상속받는(구현하는) 파생 클래스가 해당 멤버들을 반드시 정의해야 하는 책임을 갖습니다.
public interface interface_name {
// interface_members
}예를 들어 다음과 같이 인터페이스를 선언할 수 있습니다.
public interface IAnimal {
string Name { get; set; }
void MakeSound();
}클래스(Class)란?
클래스는 데이터 타입을 위한 청사진(Blueprint)입니다. 클래스 자체는 실제 데이터를 정의하지 않지만, 클래스 이름이 의미하는 바—즉, 해당 클래스의 객체가 어떤 데이터로 구성되는지, 그 객체에 어떤 연산을 수행할 수 있는지—를 명확하게 규정합니다.
class class_name {
// class_members
}앞서 선언한 인터페이스를 클래스가 구현하는 예시는 다음과 같습니다.
public class Dog : IAnimal {
public string Name { get; set; }
public void MakeSound() {
Console.WriteLine("멍멍!");
}
}인터페이스 vs 클래스 핵심 차이점
| 구분 | 인터페이스 | 클래스 |
|---|---|---|
| 필드 | 포함 불가 | 포함 가능 |
| 메서드 구현 | 선언만 가능 (C# 8.0부터 기본 구현 허용) | 직접 구현 |
| 다중 상속 | 여러 인터페이스 구현 가능 | 단 하나의 클래스만 상속 가능 |
| 인스턴스 생성 | 불가능 | 가능 |
| 접근 제한자 | 멤버는 기본적으로 public | private, protected 등 자유롭게 지정 |
언제 무엇을 사용해야 할까?
인터페이스는 서로 다른 클래스들이 공통된 동작 계약을 따르도록 강제할 때 적합합니다. 예를 들어 여러 결제 수단(카드, 계좌이체, 간편결제)이 동일한 '결제' 동작을 수행해야 한다면 인터페이스로 규격을 통일하는 것이 좋습니다.
클래스는 상태(필드)와 동작(메서드)을 함께 캡슐화하여 독립적인 객체를 만들 때 사용합니다. 재사용성과 확장성이 필요하다면 추상 클래스(Abstract Class)와 인터페이스를 적절히 조합하는 설계도 고려해 볼 만합니다.