인터페이스는 클래스 또는 구조체에 의해 구현될 계약을 정의합니다. 여기에는 메서드, 속성, 이벤트 및 인덱서가 포함될 수 있습니다. 인터페이스는 데이터를 보유하지 않고 수행할 수 있는 동작(더 정확하게는 구현하는 클래스가 수행할 수 있음)만 지정한다는 점을 제외하고는 클래스와 유사합니다.
클래스는 하나 이상의 인터페이스를 구현할 수 있습니다. 인터페이스 멤버를 구현하려면 클래스에 인터페이스 멤버와 동일한 메서드 정의, 즉 동일한 이름과 서명을 가진 공용 멤버가 있어야 합니다.
예를 들어 IComparer는 두 개체를 비교하는 메서드에 대한 계약을 정의하는 System.Collections 네임스페이스에 정의된 인터페이스입니다. Car 클래스는 IComparer 인터페이스를 구현합니다.
public interface IDriver{ void Drive(); } public class Car : IDriver{ public string Name { get; set; } public int Speed { get; set; } public void Drive(){ Console.WriteLine($"{Name}: {Speed}"); } }
인터페이스의 모든 멤버는 암시적으로 추상적이고 구현 세부 정보가 없습니다. 모든 인터페이스 멤버는 공용입니다. 인터페이스 멤버와 함께 액세스 한정자를 사용할 수 없습니다. 인터페이스를 구현하는 클래스는 인터페이스를 구현하는 공용 메서드를 제공해야 합니다.
인터페이스는 다른 인터페이스를 확장할 수 있습니다. 예를 들면 -
public interface IPerformer { void Perform(); } public interface ISinger : IPerformer{ void Sing(); }
인터페이스를 사용하면 클래스에 여러 소스의 동작을 포함할 수 있습니다. C#은 C++와 같은 다중 상속을 허용하지 않으므로 인터페이스는 C#에서 다중 상속을 달성하는 한 가지 방법입니다.
인터페이스의 단점은 API를 노출하는 데 사용할 때 클래스보다 유연성이 떨어진다는 것입니다. 인터페이스의 계약을 변경하면 해당 인터페이스를 구현하는 모든 클래스가 중단되고 인터페이스를 구현하기 위해 업데이트해야 합니다.
예시
using System; class Program{ static void Main(){ var carOne = new Car { Name = "Honda", Speed = 100 }; var carTwo = new Car { Name = "Toyota", Speed = 70 }; carOne.Drive(); carTwo.Drive(); } } public interface IDriver{ void Drive(); } public class Car : IDriver{ public string Name { get; set; } public int Speed { get; set; } public void Drive(){ Console.WriteLine($"{Name}: {Speed}"); } }
출력
Honda: 100 Toyota: 70