featur

[.net] c# interface 인터페이스 본문

개발/.NET

[.net] c# interface 인터페이스

featur 2015. 11. 6. 18:58

 

https://msdn.microsoft.com/ko-kr/library/ms173156.aspx

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

c# interface
 

인터페이스는 클래스 또는 구조체가 구현할 수 있는 연관 기능의 집합에 대한 정의를 포함합니다.

예를 들어 인터페이스를 사용하면 여러 소스의 동작을 클래스에 포함할 수 있습니다. C# 언어는 클래스에 대한 다중 상속을 지원하지 않기 때문에, 해당 기능이 중요합니다. 또한 구조체는 다른 구조체나 클래스에서 실제로 상속할 수 없기 때문에 구조체에 대한 상속을 시뮬레이트하려는 경우 인터페이스를 사용해야 합니다.

다음 예제에서는 인터페이스 키워드를 사용하여 인터페이스를 정의하는 방법을 보여줍니다.

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


 
IEquatable<T> 인터페이스를 구현하는 모든 클래스 또는 구조체는, 인터페이스가 지정하는 기호와 일치하는 Equals 메서드에 대한 정의를 포함해야 합니다. 따라서 IEquatable<T>을 구현하는 클래스를 계산하여 클래스의 인스턴스에서 동일한 클래스의 다른 인스턴스와 동일한지 여부를 확인할 수 있는 Equals 메서드를 포함할 수 있습니다.
IEquatable<T>의 정의에서는 Equals에 대한 구현을 제공하지 않습니다. 인터페이스는 서명만 정의합니다. 이런 방식으로 C#의 인터페이스는 모든 메서드가 추상인 추상 클래스와 유사합니다. 그러나 클래스 또는 구조체는 여러 인터페이스를 구현할 수 있지만 클래스는 추상인지 여부에 관계없이 단일 클래스만 상속할 수 있습니다. 따라서 인터페이스를 사용하여 여러 소스의 동작을 클래스에 포함할 수 있습니다.
추상 클래스에 대한 자세한 내용은 추상 및 봉인 클래스와 클래스 멤버를 참조하십시오.
인터페이스에는 메서드, 속성, 이벤트, 인덱서 또는 이러한 네 가지 멤버 형식의 조합이 포함될 수 있습니다. 예제에 대한 링크는 관련 단원을 참조하세요. 인터페이스에는 상수, 필드, 연산자, 인스턴스 생성자, 소멸자 또는 형식이 포함될 수 없습니다. 인터페이스 멤버는 자동으로 공용이 되며 액세스 한정자를 포함할 수 없습니다. 또한 멤버를 정적으로도 선언할 수 없습니다.
인터페이스 멤버를 구현하려면 구현 클래스의 해당 멤버가 공용이고 비정적이어야 하며 인터페이스 멤버와 동일한 이름 및 서명을 사용해야 합니다.
클래스 또는 구조체에서 인터페이스를 구현하는 경우 인터페이스에서 정의하는 모든 멤버에 대해 구현을 제공해야 합니다. 인터페이스 자체는 클래스 또는 구조체에서 기본 클래스 기능을 상속하는 방식으로 상속할 수 있는 기능을 제공하지 않습니다. 그러나 기본 클래스에서 인터페이스를 구현하는 경우에는 기본 클래스에서 파생되는 모든 클래스가 해당 구현을 상속합니다.
다음 예제는 IEquatable<T> 인터페이스의 한 가지 구현을 보여줍니다.
구현하려는 Car 클래스는 Equals 메서드의 구현을 제공해야 합니다.

 

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)
    {
        if (this.Make == car.Make &&
            this.Model == car.Model &&
            this.Year == car.Year)
        {
            return true;
        }
        else
            return false;
    }
}
클래스의 속성 및 인덱서는 인터페이스에 정의된 속성이나 인덱서에 대해 추가 접근자를 정의할 수 있습니다.

 

예를 들어 인터페이스는 get 접근자가 있는 속성을 선언할 수 있습니다.

 

인터페이스를 구현하는 클래스는 get 및 set 접근자를 둘 다 사용하는 동일한 속성을 선언할 수 있습니다.

 

그러나 속성 또는 인덱서에서 명시적 구현을 사용하는 경우에는 접근자가 일치해야 합니다.

 

명시적 구현에 대한 자세한 내용은 명시적 인터페이스 구현(C# 프로그래밍 가이드) 및 인터페이스 속성(C# 프로그래밍 가이드)을 참조하세요.
인터페이스는 다른 인터페이스를 구현할 수 있습니다. 

 

클래스는 상속하는 기본 클래스 또는 다른 인터페이스에서 구현하는 인터페이스를 통해 인터페이스를 여러 번 포함할 수 있습니다.

 

그러나 클래스는 인터페이스의 구현을 한 번만 제공할 수 있으며 클래스가 인터페이스를 클래스 정의의 일부로 선언하는 경우에만 제공할 수 있습니다(class ClassName : InterfaceName).

 

인터페이스를 구현하는 기본 클래스를 상속했기 때문에 인터페이스가 상속되는 경우 기본 클래스는 인터페이스 멤버의 구현을 제공합니다.

 

그러나 파생 클래스는 상속된 구현을 사용하는 대신 인터페이스 멤버를 다시 구현할 수 있습니다. 또한 기본 클래스는 가상 멤버를 사용하여 인터페이스 멤버를 구현할 수 있습니다.

 

이 경우 파생 클래스는 가상 멤버를 재정의하여 인터페이스 동작을 변경할 수 있습니다. 가상 멤버에 대한 자세한 내용은 다형성을 참조하세요.

인터페이스 요약

인터페이스에는 다음과 같은 속성이 있습니다.

  • 인터페이스는 추상 기본 클래스와 같습니다. 인터페이스를 구현하는 모든 클래스 또는 구조체는 모든 멤버를 구현해야 합니다.

  • 인터페이스는 직접 인스턴스화할 수 없습니다. 해당 멤버는 인터페이스를 구현하는 클래스 또는 구조체에 의해 구현됩니다.

  • 인터페이스는 이벤트, 인덱서, 메서드 및 속성을 포함할 수 있습니다.

  • 인터페이스에는 메서드의 구현이 포함되지 않습니다.

  • 클래스 또는 구조체는 여러 인터페이스를 구현할 수 있습니다. 클래스는 기본 클래스를 상속할 수 있으며 하나 이상의 인터페이스를 제공할 수도 있습니다.

'개발 > .NET' 카테고리의 다른 글

.NET Framework 4.0 내용  (0) 2015.11.27
객채 지향 프로그래밍 OOP  (0) 2015.11.26
[.net] VS visual studio 단축키  (0) 2015.11.04
[.net] c# Dictionary 사용법  (0) 2015.11.04
[.net] C# 보안 권장 사항  (0) 2015.11.04

Comments