나의 지식 보관소
인터페이스 interface 본문
인터페이스는 클래스가 따라야 하는 약속이다. 마치 플러그를 통해 전원을 공급받기 위해 따라야만 하는 전기 플러그 규격처럼 인터페이스를 상속받기위해 클래스들은 인터페이스에 선언된 모든 메서드를 구현해야 한다.
인터페이스는 메서드, 이벤트, 인덱서, 프로퍼티 등을 선언만 할 수 있고 구현부를 가질 수 없다. 또한 인스턴스를 가질 수도 없다. 하지만 자식 클래스의 인스턴스를 참조할 수 있다.
자식 클래스의 인스턴스를 참조하게 되면 인터페이스는 자신에게 선언되어있는 메서드를 호출할 수 있고 작동은 참조한 자식 클래스에 구현되어있는 대로 작동한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
interface Animal
{
void Breath();
}
class Dog : Animal
{
public void Breath()
{
Console.WriteLine("들숨날숨");
}
public void Bark()
{
Console.WriteLine("멍멍");
}
}
|
이처럼 구현되어있는 인터페이스와 클래스는 아래와 같이 사용할 수 있다.
1
2
3
|
Breath()는 인터페이스에 선언되어있으므로 자식 클래스에서 구현된 대로 작동하고, Bark()는 인터페이스에 선언돼있지 않으므로 컴파일 에러가 발생한다.
만일 기존의 인터페이스에 새로운 메서드를 추가한 인터페이스를 만들고 싶다면 인터페이스를 상속하는 인터페이스를 만들면 된다. 그냥 인터페이스를 수정해도 되지만 해당 인터페이스를 상속받는 클래스들이 이미 존재한다면 상속받는 클래스들도 모두 수정이 이루어져야 하므로 새로운 인터페이스를 만들어주는 게 낫다.
또한 클래스는 죽음의 다이아몬드 문제 때문에 다중 상속이 불가능 하지만 인터페이스는 가능하다.