coding/c#
C# 인터페이스의 이해
사과키라임파이
2021. 12. 16. 16:52
C# 인터페이스
클래스와 비슷하게 인터페이스는 메서드, 속성, 이벤트, 인덱서 등을 갖지만, 인터페이스는 이를 직접 구현하지 않고 단지 정의(prototype definition)만을 갖는다. 즉, 인터페이스는 추상 멤버(abstract member)로만 구성된 추상 Base 클래스(abstract base class)와 개념적으로 유사하다. 클래스가 인터페이스를 가지는 경우 해당 인터페이스의 모든 멤버에 대한 구현(implementation)을 제공해야 한다.
한 클래스는 하나의 Base 클래스만을 가질 수 있지만, 인터페이스는 여러 개를 가질 수 있다. 아래의 예를 보면, MyConnection 이라는 클래스는 Component 라는 하나의 Base 클래스와 IDbConnection, IDisposable이라는 2개의 인터페이스를 가지고 있음을 알 수 있다.
한 클래스는 하나의 Base 클래스만을 가질 수 있지만, 인터페이스는 여러 개를 가질 수 있다. 아래의 예를 보면, MyConnection 이라는 클래스는 Component 라는 하나의 Base 클래스와 IDbConnection, IDisposable이라는 2개의 인터페이스를 가지고 있음을 알 수 있다.
예제
public class MyConnection : Component, IDbConnection, IDisposable
{
// IDbConnection을 구현
// IDisposable을 구현
}
C# 인터페이스의 정의
인터페이스는 C# 키워드 interface를 사용하여 정의한다. 인터페이스 정의 시에는 (메서드와 같은) 내부 멤버들에 대해 public과 같은 접근 제한자를 사용하지 않는다.
예를 들어, 아래 예제에서 CompareTo() 메서드 앞에 public 을 쓸 수 없다.
예를 들어, 아래 예제에서 CompareTo() 메서드 앞에 public 을 쓸 수 없다.
예제
public interface IComparable
{
// 멤버 앞에 접근제한자 사용 안함
int CompareTo(object obj);
}
C# 인터페이스의 구현
C# 클래스가 인터페이스를 갖는 경우 인터페이스의 모든 멤버에 대한 구현을 제공해야 한다. C# 에서는 인터페이스로부터 직접 new를 사용하여 객체를 생성할 수 없다. 아래의 클래스는 IComparable이라는 인터페이스를 갖는 경우로서 IComparable.CompareTo() 메서드를 구현한 예이다.
상클래스는 다른 파생 클래스들의 Base 클래스로 사용될 때 주로 사용됩니다.
추상클래스는 abstract 메서드 이외에 실제 구현을 가진 메서드를 가질 수 있으며,
기타 필요한 필드들을 가질 수 있으며, 이러한 필드들을 파생 클래스에서 사용하게 할 수 있습니다. 반면, 인터페이스는 클래스가 가지는 행위 (혹은 일부 행위들의 집합)를 표현하기 위한 것이고, 추상클래스처럼 다른 클래스의 Base 클래스가 되는 일을 하지 않습니다.
추상클래스는 abstract 메서드 이외에 실제 구현을 가진 메서드를 가질 수 있으며,
기타 필요한 필드들을 가질 수 있으며, 이러한 필드들을 파생 클래스에서 사용하게 할 수 있습니다. 반면, 인터페이스는 클래스가 가지는 행위 (혹은 일부 행위들의 집합)를 표현하기 위한 것이고, 추상클래스처럼 다른 클래스의 Base 클래스가 되는 일을 하지 않습니다.
-----------
클래스 및 구조체로 구현할 수 있는 규약을 정의한다.
그냥 선언하고 상속하듯이 써서 구현해야 하니까. 그럼 이걸 왜 만들어 논것일까? 서두에 이야기 했듯이 규약이다. 특정 클래스에서는 반드시 특정한 기능을 구현해야 한다는 규칙이 있는 경우 인터페이스를 구현하도록 강제하는 기능이라는 것이다. 인터페이스는 메서드, 속성, 이벤트, 인덱서를 포함할 수 있으며 맴버의 기능을 구현하지 않는다.
즉, 껍데기만 있다라고 생각하면 되겠다.
인터페이스는 다중상속이 가능하여 클래스의 단일 상속과는 다른데
하나의 클래스에서 다중인터페이스를 구현 할 수 있다는 것이다. 여기서 상속과는 헷갈리면 안된다.