인터페이스의 사용법을 알아 보자
사실 인터페이스는의 사용법 자체는 아주 간단하다.
중요한 것은 객체 지향 언어에서의 인터페이스의 역할과 적절한 목적이다.
잘 설계된 , 확장과 유지/보수를 위해서 인터페이스는 적절한 사용은 필수적이다.
그러나 여기서는 인터페이스이 기본적인 사용 방법과 특징을 알아 본다
* 인터페이스 특징
= 인터페이스 입장 =
1) 인터페이스는 메쏘드 만을 가진다
2) 인터페이스의 메쏘드는 시그너쳐 만을 기술한다
3) 인터페이스의 메쏘드에 접근 한정자를 지정할 수 없다
모든 메쏘드는 실질적으로 public 이다
4) 인터페이스는 필드(변수)를 정의 할 수 없다
단, 프로퍼티는 정의할 수 있다 (프로퍼티 역시 메소드 이므로)
5) 인터페이스로 직접 객체 생성(new 인터페이스()) 하지 못한다
= 인터페이스를 구현하는 클래스 입장 =
1) 클래스는 다중 인터페이스를 구현 할 수 있다
기본적으로 클래스의 다중 상속은 불가능 하다. 단 인터페이스의 다중 구현은 가능하다
2) 인터페이스의 메쏘드 구현시 반드시 public 접근 한정자를 지정해야 한다
어차피 인터페이스에 정의된 메쏘드는 실질적으로 public 라고 했다.
단, 명시적 인터페이스 메쏘드 구현일 경우에는 public 을 생략해야 한다
3) 인터페이스의 메쏘드 구현시 virtual 로 구현할 수 있다
4) 결국 인터페이스의 메쏘드를 오버라이딩 하는 것이지만 명시적으로 override 키워드를 사용하면 안된다.
* Ex
데모를 보며 위의 특징을 음미 해 보 자
1. 인터페이스 정의와 인터페이스를 구현한 클래스

2. 사용 예

3. 실행 결과

* 명시적 인터페이스 메쏘드 구현
인터페이스를 구현한 클래스에서 인터페이스의 메쏘드 구현을 반드시 그 인터페이스 타입을 통해서만 호출 가능하도록 만들 수 있다. 이를 명시적 인터페이스 메쏘드 구현이라 한다.
위의 데모는 명시적으로 하지 않았다. 따라서 아래와 같은 코드도 가능하다
Zelot z = new Zelot();
z.Attack();
그러나 이것을 아래와 같이 명시적 인터페이스로 구현한다면..
class Zelot : IAttackAble
{
void IAttackAble.Attack()
{
Console.WriteLine("사시미 어텍");
}
}
더이상 ,
Zelot z = new Zelot();
z.Attack(); //error
로 호출 할 수 없다.
반드시 아래와 같이 호출 해야 한다
IAttackAble z = new Zelot();
z.Attack();
즉, 반드시 IAttackAble 변수로만 메쏘드를 호출 할 수 있다
명시적 인터페이스를 구현할 경우에는 public 접근 한정자를 생략해야 한다.
어차피 인터페이스를 통해서만이 메쏘드의 호출이 가능하기 때문에 public 접근 한정자를 지정하지 않음은 당연할 것이다. (인터페이스의 모든 메쏘드는 public 라고 했다)