인터페이스는 기본적으로 구현해야될 객체를 담은 틀이다. 인터페이스는 내부에 구현해야될 멤버의 이름만 가지고 있으며 이를 상속받는 클래스는 이 인터페이스에 있는 멤버를 무조건 구현해줘야된다. 인터페이스는 그 특징상 new 키워드를 통해서 직접 객체를 할당할 수 없으며 대신에 다른 클래스에서 이를 구현함으로써 상속받는 클래스에서 공통된 이름의 메소드를 가지게 해서 사용할수 있게 만들어준다.

↑인터페이스

↑인터페이스 멤버를 구성하지 않을경우 발생하는 에러문구
interface를 선언하는 방법은 interface 키워드를 사용해서 만들며 인터페이스 이름은 암묵적으로 대문자 I를 첫글자로 쓰도록 합의되어있다.(물론 문법적인 문제는 아니지만 프로그래머들이 암묵적으로 I라고 쓰는게 관습적으로 되어있기 때문에 가급적이면 대문자 I를 써서 작성한다)

↑인터페이스와 그 인터페이스로 만든 클래스
C#은 다중상속의 위험성 때문에 클래스의 다중상속을 지원하지 않지만 인터페이스의 경우 내부에 구체적인 구현이 없기 때문에 인터페이스를 다수 상속하는것이 가능하다.

↑3개의 인터페이스를 상속받는 test클래스
또한 인터페이스 또한 서로 상속을 받아서 구현할수 있다

↑서로를 상속하는 인터페이스와 test3을 상속받는 클래스 test
이전에 언급된 추상클래스와 인터페이스는 다음과 같은 차이가 있다
인터페이스
추상클래스
인터페이스는 또한 메소드외에도 프로퍼티,인덱서등을 가질수 있다. 메소드와 마찬가지로 내부에 구현을 가질수 없기에 상속받는 클래스에서 구현을 반드시 해줘야 되나 그 사용법에 있어서는 일반적인 클래스의 자동 구현 프로퍼티와 동일하다.

↑인터페이스의 프로퍼티 구현과 실제 사용
자동구현 프로퍼티는 컴파일 단계에서 자동적으로 내부에 필드를 서술해주기 때문에 프로퍼티를 간단하게 쓸수있게 해준다

↑코드와 il디어셈블리 도구로 본 내부 구조.
인터페이스는 내부에 있는 모든 구성요소를 구현해줘야 되었기 때문에 실제 사용된 뒤에 인터페이스가 수정되었을경우 상속받은 모든 클래스에서 타입 에러가 발생하는 문제가 있었다. 이경우 모든 파생 클래스를 수정해줘야 되었지만 C# 8.0 에서 디폴트 인터페이스 멤버라는 기능이 추가되면서 수고를 덜어주게 되었다.

↑기본메소드 구현과 아래에서 새롭게 구현한 클래스 now
물론 해당되는 정의를 반드시 쓸 필요는 없고 상속받는 클래스에서 구현하지 않거나(사실 상속받는 모든 클래스에 별도로 구현하지 않고도 인터페이스를 새롭게 수정하기 위해서 만들어진 개념이다) 상속받는 클래스에서 새롭게 고쳐써도 된다.

↑실제 기본 인터페이스 멤버의 사용 예시

↑ 실행결과
출저