개요
안녕하세요. 이번 글에서는 C#의 인터페이스(interface)에 대해 알아보겠습니다. 인터페이스는 “무엇을 할 수 있어야 하는지”만 정해 둔 규격(계약)입니다. 구현 내용은 없고 메서드·프로퍼티의 목록만 정의하며, 실제 동작은 이를 구현하는 클래스가 채웁니다.
인터페이스 정의와 구현
인터페이스는 interface 키워드로 정의하고, 이름은 보통 I로 시작합니다(IAnimal 등). 안에는 몸체 없는 멤버만 선언합니다. 클래스는 : 인터페이스이름으로 구현하며, 모든 멤버를 반드시 구현해야 합니다.
interface IAnimal
{
void Speak(); // 몸체 없이 선언만
string Name { get; }
}
class Dog : IAnimal // IAnimal을 구현
{
public string Name { get; set; }
public void Speak() // 반드시 구현해야 함
{
Console.WriteLine("멍멍");
}
}
인터페이스의 멤버는 기본적으로 public이며, 구현하는 클래스에서도 public으로 구현해야 합니다.
인터페이스 타입으로 다루기 — 다형성
인터페이스의 진짜 쓸모는 여기 있습니다. 서로 다른 클래스를 같은 인터페이스 타입으로 묶어 동일하게 다룰 수 있습니다.
class Cat : IAnimal
{
public string Name { get; set; }
public void Speak() => Console.WriteLine("야옹");
}
// IAnimal 타입으로 Dog, Cat을 함께 다룸
List<IAnimal> animals = new List<IAnimal>
{
new Dog { Name = "바둑이" },
new Cat { Name = "나비" }
};
foreach (IAnimal a in animals)
a.Speak(); // 각 클래스의 구현이 호출됨 (멍멍 / 야옹)
호출하는 쪽은 IAnimal이라는 규격만 알면 되고, 실제로 Dog인지 Cat인지는 신경 쓰지 않아도 됩니다.
인터페이스 vs 추상 클래스
비슷해 보이지만 역할이 다릅니다. 핵심 차이는 다중 구현 가능 여부와 구현 코드 포함 여부입니다.
| 구분 | 인터페이스 | 추상 클래스 |
|---|---|---|
| 내용 | 선언만 (규격) | 일부 구현 포함 가능 |
| 다중 상속 | 여러 개 구현 가능 | 하나만 상속 가능 |
| 필드 | 불가 | 가능 |
| 의미 | “~할 수 있다”(능력) | “~의 일종이다”(계층) |
C#은 클래스 다중 상속을 막지만, 인터페이스는 여러 개를 동시에 구현할 수 있습니다.
interface IFlyable { void Fly(); }
interface ISwimmable { void Swim(); }
class Duck : IFlyable, ISwimmable // 여러 인터페이스 동시 구현
{
public void Fly() => Console.WriteLine("날다");
public void Swim() => Console.WriteLine("헤엄치다");
}
언제 쓰나
- 서로 다른 클래스에 공통 기능(능력)을 강제하고 싶을 때 (IDisposable, IComparable 등)
- 구현을 바꿔 끼울 수 있게 느슨하게 연결하고 싶을 때 (의존성 주입, 테스트의 가짜 객체)
- 한 클래스가 여러 역할을 동시에 가져야 할 때
정리
- 인터페이스는 구현 없이 멤버 목록만 정의하는 규격(계약)이다.
- 구현 클래스는 : 인터페이스로 선언하고 모든 멤버를 public으로 구현한다.
- 서로 다른 클래스를 같은 인터페이스 타입으로 묶어 다형적으로 다룰 수 있다.
- 클래스는 하나만 상속하지만 인터페이스는 여러 개 구현 가능하다.
- “~의 일종이다”는 추상 클래스, “~할 수 있다”는 인터페이스로 구분하면 쉽다.
인터페이스는 “무엇을 할 수 있어야 하는가”만 약속하고 구현은 각 클래스에 맡깁니다. 덕분에 코드를 느슨하게 연결하고 유연하게 확장할 수 있습니다. 이상으로 C# 인터페이스에 대해 간단히 알아보았습니다.