interface(C# 참조)

인터페이스는 계약을 정의합니다. 해당 계약을 구현 하는 class, record 또는 struct는 인터페이스에 정의된 구성원의 구현을 제공해야 합니다. 인터페이스는 멤버에 대한 기본 구현을 정의할 수 있습니다. 공통적인 기능에 대해 단일 구현을 제공하기 위해 static 구성원을 정의할 수도 있습니다. C# 11부터 인터페이스는 구현 형식이 선언된 멤버를 제공해야 함을 선언하기 위해 static abstract 또는 static virtual 멤버를 정의할 수 있습니다. 일반적으로 static virtual 메서드는 구현이 오버로드된 연산자 집합을 정의해야 한다고 선언합니다.

다음 예제에서 ImplementationClass 클래스는 매개 변수가 없고 void를 반환하는 SampleMethod라는 메서드를 구현해야 합니다.

자세한 내용과 예제는 인터페이스를 참조하세요.

인터페이스 예제

interface ISampleInterface
{
    void SampleMethod();
}

class ImplementationClass : ISampleInterface
{
    // Explicit interface member implementation:
    void ISampleInterface.SampleMethod()
    {
        // Method implementation.
    }

    static void Main()
    {
        // Declare an interface instance.
        ISampleInterface obj = new ImplementationClass();

        // Call the member.
        obj.SampleMethod();
    }
}

인터페이스는 네임스페이스 또는 클래스의 구성원일 수 있습니다. 인터페이스 선언에는 다음 구성원의 선언(구현이 없는 서명)을 포함할 수 있습니다.

기본 인터페이스 멤버

이러한 이전 멤버 선언에는 일반적으로 본문이 포함되어 있지 않습니다. 인터페이스 멤버는 본문을 선언할 수 있습니다. 인터페이스의 멤버 본문은 기본 구현입니다. 본문이 있는 구성원은 인터페이스가 재정의 구현을 제공하지 않는 클래스 및 구조체에 대해 "기본" 구현을 제공하도록 허용할 수 있습니다. 인터페이스에는 다음이 포함될 수 있습니다.

정적 추상 및 가상 멤버

C# 11부터 인터페이스는 필드를 제외한 모든 멤버 유형에 대해 static abstractstatic virtual 멤버를 선언할 수 있습니다. 인터페이스는 구현 형식이 연산자 또는 기타 정적 멤버를 정의해야 한다고 선언할 수 있습니다. 이 기능을 사용하면 제네릭 알고리즘이 숫자와 유사한 동작을 지정할 수 있습니다. System.Numerics.INumber<TSelf>와 같은 .NET 런타임의 숫자 형식에서 예를 볼 수 있습니다. 이러한 인터페이스는 다양한 숫자 형식으로 구현되는 일반적인 수학 연산자를 정의합니다. 컴파일러는 컴파일 시간에 static virtualstatic abstract 메서드에 대한 호출을 확인해야 합니다. 인터페이스에 선언된 static virtualstatic abstract 메서드에는 클래스에 선언된 virtual 또는 abstract 메서드와 유사한 런타임 디스패치 메커니즘이 없습니다. 대신 컴파일러는 컴파일 시간에 사용 가능한 형식 정보를 사용합니다. 따라서 static virtual 메서드는 거의 제외적으로 제네릭 인터페이스에서 선언됩니다. 또한 static virtual 또는 static abstract 메서드를 선언하는 대부분의 인터페이스는 형식 매개 변수 중 하나가 선언된 인터페이스를 구현해야 한다고 선언합니다. 예를 들어, INumber<T> 인터페이스는 TINumber<T>를 구현해야 한다고 선언합니다. 컴파일러는 형식 인수를 사용하여 인터페이스 선언에 선언된 메서드 및 연산자에 대한 호출을 확인합니다. 예를 들어, int 형식은 INumber<int>를 구현합니다. 형식 매개 변수 T가 형식 인수 int를 나타내는 경우 int에 선언된 static 멤버가 호출됩니다. 또는 double이 형식 인수인 경우 double 형식에 선언된 static 멤버가 호출됩니다.

Important

인터페이스에 선언된 static abstractstatic virtual 메서드에 대한 메서드 디스패치는 식의 컴파일 시간 형식을 사용하여 확인됩니다. 식의 런타임 형식이 다른 컴파일 시간 형식에서 파생된 경우 기본(컴파일 시간) 형식의 정적 메서드가 호출됩니다.

인터페이스의 정적 추상 멤버에 대한 자습서를 통해 이 기능을 사용해 볼 수 있습니다.

인터페이스 상속

인터페이스에는 인스턴스 상태를 포함할 수 없습니다. 이제 정적 필드가 허용되지만 인터페이스에서는 인스턴스 필드가 허용되지 않습니다. 인스턴스 자동 속성은 숨겨진 필드를 암시적으로 선언하므로 인터페이스에서 지원되지 않습니다. 이 규칙은 속성 선언에 미묘한 영향을 미칩니다. 인터페이스 선언에서 다음 코드는 class 또는 struct에서와 같이 자동 구현 속성을 선언하지 않습니다. 대신, 기본 구현은 없지만 인터페이스를 구현하는 형식에서 구현되어야 하는 속성을 선언합니다.

public interface INamed
{
  public string Name {get; set;}
}

인터페이스는 하나 이상의 기본 인터페이스에서 상속할 수 있습니다. 인터페이스가 기본 인터페이스에 구현된 메서드를 재정의하는 경우 명시적 인터페이스 구현 구문을 사용해야 합니다.

기본 형식 목록에 기본 클래스 및 인터페이스가 포함된 경우 기본 클래스가 목록의 첫 번째 항목이어야 합니다.

인터페이스를 구현하는 클래스는 해당 인터페이스의 멤버를 명시적으로 구현할 수 있습니다. 명시적으로 구현된 멤버는 클래스 인스턴스를 통해 액세스할 수 없고 인터페이스 인스턴스를 통해서만 액세스할 수 있습니다. 또한 기본 인터페이스 구성원은 인터페이스의 인스턴스를 통해서만 액세스할 수 있습니다.

명시적 인터페이스 구현에 대한 자세한 내용은 명시적 인터페이스 구현을 참조하세요.

인터페이스 구현 예제

다음 예제에서는 인터페이스의 구현 방법을 보여 줍니다. 이 예제에서 인터페이스에는 속성 선언이 포함되어 있고, 클래스에는 구현이 포함되어 있습니다. IPoint를 구현하는 클래스의 모든 인스턴스에는 정수 속성 xy가 있습니다.

interface IPoint
{
    // Property signatures:
    int X { get; set; }

    int Y { get; set; }

    double Distance { get; }
}

class Point : IPoint
{
    // Constructor:
    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    // Property implementation:
    public int X { get; set; }

    public int Y { get; set; }

    // Property implementation
    public double Distance =>
       Math.Sqrt(X * X + Y * Y);
}

class MainClass
{
    static void PrintPoint(IPoint p)
    {
        Console.WriteLine("x={0}, y={1}", p.X, p.Y);
    }

    static void Main()
    {
        IPoint p = new Point(2, 3);
        Console.Write("My Point: ");
        PrintPoint(p);
    }
}
// Output: My Point: x=2, y=3

C# 언어 사양

자세한 내용은 C# 언어 사양인터페이스 섹션, C# 8 - 기본 인터페이스 멤버의 기능 사양 및 C# 11 - 정적 개요의 기능 사양 인터페이스의 멤버을 참조하세요.

참고 항목