interface(C# 참조)
인터페이스는 계약을 정의합니다. 해당 계약을 구현 하는 class 또는 struct는 인터페이스에 정의된 구성원의 구현을 제공해야 합니다. 인터페이스는 멤버에 대한 기본 구현을 정의할 수 있습니다. 공통적인 기능에 대해 단일 구현을 제공하기 위해 static 구성원을 정의할 수도 있습니다. C# 11부터 인터페이스는 또는 static virtual 멤버를 정의 static abstract 하여 구현 형식이 선언된 멤버를 제공해야 한다고 선언할 수 있습니다. 일반적으로 메서드는 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();
}
}
인터페이스는 네임스페이스 또는 클래스의 구성원일 수 있습니다. 인터페이스 선언에는 다음 구성원의 선언(구현이 없는 서명)을 포함할 수 있습니다.
기본 인터페이스 멤버
이러한 이전 멤버 선언에는 일반적으로 본문이 포함되지 않습니다. 인터페이스 멤버는 본문을 선언할 수 있습니다. 인터페이스의 멤버 본문은 기본 구현입니다. 본문이 있는 구성원은 인터페이스가 재정의 구현을 제공하지 않는 클래스 및 구조체에 대해 "기본" 구현을 제공하도록 허용할 수 있습니다. 인터페이스에는 다음이 포함될 수 있습니다.
- 상수
- 연산자
- 정적 생성자.
- 중첩 형식
- 정적 필드, 메서드, 속성, 인덱서 및 이벤트
- 명시적 인터페이스 구현 구문을 사용하는 멤버 선언입니다.
- 명시적 액세스 한정자(기본 액세스는
public)
정적 추상 및 가상 멤버
C# 11부터 인터페이스는 필드를 제외한 모든 멤버 형식에 대해 및 static virtual 멤버를 선언 static abstract 할 수 있습니다. 인터페이스는 형식 구현이 연산자 또는 다른 정적 멤버를 정의해야 한다고 선언할 수 있습니다. 이 기능을 사용하면 제네릭 알고리즘에서 숫자와 유사한 동작을 지정할 수 있습니다. 와 같은 System.Numerics.INumber<TSelf>.NET 런타임의 숫자 형식에서 예제를 볼 수 있습니다. 이러한 인터페이스는 많은 숫자 형식으로 구현되는 일반적인 수학 연산자를 정의합니다. 컴파일러는 컴파일 시간에 및 static abstract 메서드에 대한 호출을 static virtual resolve 합니다. static virtual 인터페이스에 선언된 및 static abstract 메서드에는 클래스에서 선언된 또는 abstract 메서드와 유사한 virtual 런타임 디스패치 메커니즘이 없습니다. 대신 컴파일러는 컴파일 시간에 사용할 수 있는 형식 정보를 사용합니다. 따라서 static virtual 메서드는 제네릭 인터페이스에서 거의 독점적으로 선언됩니다. 또한 또는 static abstract 메서드를 선언 static virtual 하는 대부분의 인터페이스는 형식 매개 변수 중 하나가 선언된 인터페이스를 구현해야 한다고 선언합니다. 예를 들어 인터페이스는 INumber<T> 를 구현INumber<T>해야 하는 를 T 선언합니다. 컴파일러는 형식 인수를 사용하여 인터페이스 선언에 선언된 메서드 및 연산자에 대한 호출을 resolve. 예를 들어 형식은 를 int 구현합니다 INumber<int>. 형식 매개 변수 T 가 형식 인수 intstatic 를 나타내는 경우 에 int 선언된 멤버가 호출됩니다. 또는 가 형식 인수 static 인 경우 double 형식에 대해 선언된 멤버가 double 호출됩니다.
중요
인터페이스에 선언된 및 static virtual 메서드에 대한 static abstract 메서드 디스패치는 식의 컴파일 시간 형식을 사용하여 확인됩니다. 식의 런타임 형식이 다른 컴파일 시간 형식에서 파생된 경우 기본(컴파일 시간) 형식의 정적 메서드가 호출됩니다.
인터페이스의 정적 추상 멤버에 대한 자습서를 사용하여 이 기능을 사용해 볼 수 있습니다.
인터페이스 상속
인터페이스에는 인스턴스 상태를 포함할 수 없습니다. 이제 정적 필드가 허용되지만 instance 필드는 인터페이스에서 허용되지 않습니다. 인스턴스 자동 속성 은 숨겨진 필드를 암시적으로 선언하므로 인터페이스에서 지원되지 않습니다. 이 규칙은 속성 선언에 미묘한 영향을 미칩니다. 인터페이스 선언에서 다음 코드는 또는 struct에서 class 와 같이 자동 구현 속성을 선언하지 않습니다. 대신, 기본 구현은 없지만 인터페이스를 구현하는 형식에서 구현되어야 하는 속성을 선언합니다.
public interface INamed
{
public string Name {get; set;}
}
인터페이스는 하나 이상의 기본 인터페이스에서 상속할 수 있습니다. 인터페이스가 기본 인터페이스에 구현된 메서드를 재정의하는 경우 명시적 인터페이스 구현 구문을 사용해야 합니다.
기본 형식 목록에 기본 클래스 및 인터페이스가 포함된 경우 기본 클래스가 목록의 첫 번째 항목이어야 합니다.
인터페이스를 구현하는 클래스는 해당 인터페이스의 멤버를 명시적으로 구현할 수 있습니다. 명시적으로 구현된 멤버는 클래스 instance 통해서만 액세스할 수 없으며 인터페이스의 instance 통해서만 액세스할 수 있습니다. 또한 기본 인터페이스 구성원은 인터페이스의 인스턴스를 통해서만 액세스할 수 있습니다.
명시적 인터페이스 구현에 대한 자세한 내용은 명시적 인터페이스 구현을 참조하세요.
인터페이스 구현 예제
다음 예제에서는 인터페이스의 구현 방법을 보여 줍니다. 이 예제에서 인터페이스에는 속성 선언이 포함되어 있고, 클래스에는 구현이 포함되어 있습니다. IPoint를 구현하는 클래스의 모든 인스턴스에는 정수 속성 x 및 y가 있습니다.
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 - 정적 추상 멤버에 대한 기능 사양을 참조하세요.
참고 항목
.NET feedback
피드백
다음에 대한 사용자 의견 제출 및 보기