인터페이스(C# 프로그래밍 가이드)Interfaces (C# Programming Guide)

인터페이스에는 클래스 또는 구조체에서 구현할 수 있는 관련 기능 그룹에 대한 정의가 포함되어 있습니다.An interface contains definitions for a group of related functionalities that a class or a struct can implement.

예를 들어 인터페이스를 사용하면 여러 소스의 동작을 클래스에 포함할 수 있습니다.By using interfaces, you can, for example, include behavior from multiple sources in a class. 해당 기능은 언어가 클래스의 여러 상속을 지원하지 않기 때문에 C#에서 중요합니다.That capability is important in C# because the language doesn't support multiple inheritance of classes. 또한 구조체는 다른 구조체나 클래스에서 실제로 상속할 수 없기 때문에 구조체에 대한 상속을 시뮬레이트하려는 경우 인터페이스를 사용해야 합니다.In addition, you must use an interface if you want to simulate inheritance for structs, because they can't actually inherit from another struct or class.

다음 예제와 같이 인터페이스 키워드를 사용하여You define an interface by using the interface keyword. 인터페이스를 정의합니다.as the following example shows.

interface IEquatable<T>
{
    bool Equals(T obj);
}

구조체의 이름은 유효한 C# 식별자 이름이어야 합니다.The name of the struct must be a valid C# identifier name. 규칙에 따라 인터페이스 이름은 대문자 I로 시작합니다.By convention, interface names begin with a capital I.

IEquatable<T> 인터페이스를 구현하는 모든 클래스나 구조체에는 인터페이스에서 지정한 서명과 일치하는 Equals 메서드에 대한 정의가 포함되어 있어야 합니다.Any class or struct that implements the IEquatable<T> interface must contain a definition for an Equals method that matches the signature that the interface specifies. 따라서 IEquatable<T>을 구현하는 클래스를 계산하여 클래스의 인스턴스에서 동일한 클래스의 다른 인스턴스와 동일한지 여부를 확인할 수 있는 Equals 메서드를 포함할 수 있습니다.As a result, you can count on a class that implements IEquatable<T> to contain an Equals method with which an instance of the class can determine whether it's equal to another instance of the same class.

IEquatable<T>의 정의에서는 Equals에 대한 구현을 제공하지 않습니다.The definition of IEquatable<T> doesn’t provide an implementation for Equals. 인터페이스는 서명만 정의합니다.The interface defines only the signature. 이런 방식으로 C#의 인터페이스는 모든 메서드가 추상인 추상 클래스와 유사합니다.In that way, an interface in C# is similar to an abstract class in which all the methods are abstract. 그러나 클래스 또는 구조체는 여러 인터페이스를 구현할 수 있지만 클래스는 추상인지 여부에 관계없이 단일 클래스만 상속할 수 있습니다.However, a class or struct can implement multiple interfaces, but a class can inherit only a single class, abstract or not.

추상 클래스에 대한 자세한 내용은 추상 및 봉인 클래스와 클래스 멤버를 참조하세요.For more information about abstract classes, see Abstract and Sealed Classes and Class Members.

인터페이스에는 메서드, 속성, 이벤트, 인덱서 또는 이러한 네 가지 멤버 형식의 조합이 포함될 수 있습니다.Interfaces can contain methods, properties, events, indexers, or any combination of those four member types. 예제에 대한 링크는관련 단원을 참조하세요.For links to examples, see Related Sections. 인터페이스에는 상수, 필드, 연산자, 인스턴스 생성자, 종료자 또는 형식이 포함될 수 없습니다.An interface can't contain constants, fields, operators, instance constructors, finalizers, or types. 인터페이스 멤버는 자동으로 공용이 되며 액세스 한정자를 포함할 수 없습니다.Interface members are automatically public, and they can't include any access modifiers. 또한 멤버는 정적일 수 없습니다.Members also can't be static.

인터페이스 멤버를 구현하려면 구현 클래스의 해당 멤버가 공용이고 비정적이어야 하며 인터페이스 멤버와 동일한 이름 및 서명을 사용해야 합니다.To implement an interface member, the corresponding member of the implementing class must be public, non-static, and have the same name and signature as the interface member.

클래스 또는 구조체에서 인터페이스를 구현하는 경우 인터페이스에서 정의하는 모든 멤버에 대해 구현을 제공해야 합니다.When a class or struct implements an interface, the class or struct must provide an implementation for all of the members that the interface defines. 인터페이스 자체는 클래스 또는 구조체에서 기본 클래스 기능을 상속하는 방식으로 상속할 수 있는 기능을 제공하지 않습니다.The interface itself provides no functionality that a class or struct can inherit in the way that it can inherit base class functionality. 그러나 기본 클래스에서 인터페이스를 구현하는 경우에는 기본 클래스에서 파생되는 모든 클래스가 해당 구현을 상속합니다.However, if a base class implements an interface, any class that's derived from the base class inherits that implementation.

다음 예제에서는 IEquatable<T> 인터페이스의 구현을 보여 줍니다.The following example shows an implementation of the IEquatable<T> interface. 구현 클래스 CarEquals 메서드의 구현을 제공해야 합니다.The implementing class, Car, must provide an implementation of the Equals method.

public class Car : IEquatable<Car>
{
    public string Make {get; set;}
    public string Model { get; set; }
    public string Year { get; set; }

    // Implementation of IEquatable<T> interface
    public bool Equals(Car car)
    {
        return this.Make == car.Make &&
               this.Model == car.Model &&
               this.Year == car.Year;
    }
}

클래스의 속성 및 인덱서는 인터페이스에 정의된 속성이나 인덱서에 대해 추가 접근자를 정의할 수 있습니다.Properties and indexers of a class can define extra accessors for a property or indexer that's defined in an interface. 예를 들어 인터페이스는 get 접근자가 있는 속성을 선언할 수 있습니다.For example, an interface might declare a property that has a get accessor. 인터페이스를 구현하는 클래스는 getset 접근자를 둘 다 사용하는 동일한 속성을 선언할 수 있습니다.The class that implements the interface can declare the same property with both a get and set accessor. 그러나 속성 또는 인덱서에서 명시적 구현을 사용하는 경우에는 접근자가 일치해야 합니다.However, if the property or indexer uses explicit implementation, the accessors must match. 명시적 구현에 대한 자세한 내용은 명시적 인터페이스 구현인터페이스 속성(C# 프로그래밍 가이드)을 참조하세요.For more information about explicit implementation, see Explicit Interface Implementation and Interface Properties.

인터페이스는 다른 인터페이스에서 상속할 수 있습니다.Interfaces can inherit from other interfaces. 클래스는 상속하는 기본 클래스 또는 다른 인터페이스에서 상속하는 인터페이스를 통해 인터페이스를 여러 번 포함할 수 있습니다.A class might include an interface multiple times through base classes that it inherits or through interfaces that other interfaces inherit. 그러나 클래스는 인터페이스의 구현을 한 번만 제공할 수 있으며 클래스가 인터페이스를 클래스 정의의 일부로 선언하는 경우에만 제공할 수 있습니다(class ClassName : InterfaceName).However, the class can provide an implementation of an interface only one time and only if the class declares the interface as part of the definition of the class (class ClassName : InterfaceName). 인터페이스를 구현하는 기본 클래스를 상속했기 때문에 인터페이스가 상속되는 경우 기본 클래스는 인터페이스 멤버의 구현을 제공합니다.If the interface is inherited because you inherited a base class that implements the interface, the base class provides the implementation of the members of the interface. 그러나 파생 클래스는 상속된 구현을 사용하는 대신 가상 인터페이스 멤버를 다시 구현할 수 있습니다.However, the derived class can reimplement any virtual interface members instead of using the inherited implementation.

또한 기본 클래스는 가상 멤버를 사용하여 인터페이스 멤버를 구현할 수 있습니다.A base class can also implement interface members by using virtual members. 이 경우 파생 클래스는 가상 멤버를 재정의하여 인터페이스 동작을 변경할 수 있습니다.In that case, a derived class can change the interface behavior by overriding the virtual members. 가상 멤버에 대한 자세한 내용은 다형성을 참조하세요.For more information about virtual members, see Polymorphism.

인터페이스 요약Interfaces summary

인터페이스에는 다음과 같은 속성이 있습니다.An interface has the following properties:

  • 인터페이스는 추상 멤버만 갖는 추상 기본 클래스와 같습니다.An interface is like an abstract base class with only abstract members. 인터페이스를 구현하는 모든 클래스 또는 구조체는 모든 멤버를 구현해야 합니다.Any class or struct that implements the interface must implement all its members.
  • 인터페이스는 직접 인스턴스화할 수 없습니다.An interface can't be instantiated directly. 해당 멤버는 인터페이스를 구현하는 클래스 또는 구조체에 의해 구현됩니다.Its members are implemented by any class or struct that implements the interface.
  • 인터페이스는 이벤트, 인덱서, 메서드 및 속성을 포함할 수 있습니다.Interfaces can contain events, indexers, methods, and properties.
  • 인터페이스에는 메서드의 구현이 포함되지 않습니다.Interfaces contain no implementation of methods.
  • 클래스 또는 구조체는 여러 인터페이스를 구현할 수 있습니다.A class or struct can implement multiple interfaces. 클래스는 기본 클래스를 상속할 수 있으며 하나 이상의 인터페이스를 제공할 수도 있습니다.A class can inherit a base class and also implement one or more interfaces.

단원 내용In this section

명시적 인터페이스 구현Explicit Interface Implementation
인터페이스와 관련된 클래스 멤버를 만드는 방법에 대해 설명합니다.Explains how to create a class member that’s specific to an interface.

방법: 인터페이스 멤버를 명시적으로 구현How to: Explicitly Implement Interface Members
인터페이스 멤버를 명시적으로 구현하는 방법에 대한 예제를 제공합니다.Provides an example of how to explicitly implement members of interfaces.

방법: 두 인터페이스의 멤버를 명시적으로 구현How to: Explicitly Implement Members of Two Interfaces
상속을 포함하는 인터페이스 멤버를 명시적으로 구현하는 방법에 대한 예제를 제공합니다.Provides an example of how to explicitly implement members of interfaces with inheritance.

관련 단원Related Sections

인터페이스학습 C# 3.0. C# 3.0의 기본 사항 마스터의 인터페이스Interfaces in Learning C# 3.0: Master the Fundamentals of C# 3.0

참고 항목See also