C#에서는 인터페이스(interface) 멤버를 암시적 구현(Implicit Implementation) 또는 명시적 구현(Explicit Implementation) 두 가지 방식으로 구현할 수 있습니다. 이 글에서는 그중 암시적 구현이 무엇인지, 어떤 상황에서 사용하는 것이 적합한지 자세히 살펴보겠습니다.
암시적 구현이란?
암시적 구현은 멤버 이름 앞에 구현하려는 인터페이스의 이름을 붙이지 않는 방식입니다. 컴파일러가 해당 멤버가 어느 인터페이스를 구현하는 것인지 자동으로 추론합니다.
암시적으로 구현된 멤버는 public으로 공개되며, 클래스 타입 그대로 접근할 수 있을 뿐만 아니라, 객체를 해당 인터페이스 타입으로 캐스팅했을 때에도 동일하게 접근 가능합니다.
메서드 호출 방식
암시적 구현의 가장 큰 장점은 호출 방식이 일반 메서드와 다르지 않다는 점입니다. 단순히 클래스의 객체를 생성한 뒤 바로 메서드를 호출하면 됩니다. 별도의 인터페이스 타입으로 변환할 필요가 없어 코드가 간결하고 직관적입니다.
암시적 구현의 한계
다만 암시적 구현에는 제약이 있습니다. 여러 인터페이스에 동일한 시그니처의 메서드가 선언되어 있는 경우에는 암시적 구현을 사용할 수 없습니다. 이런 경우에는 멤버 이름 앞에 인터페이스 이름을 명시하는 명시적 구현(Explicit Implementation)을 사용해야 충돌을 해결할 수 있습니다.
예제 코드
interface ICar {
void displayCar();
}
interface IBike {
void displayBike();
}
class ShowRoom : ICar, IBike {
public void displayCar() {
throw new NotImplementedException();
}
public void displayBike() {
throw new NotImplementedException();
}
}
class Program {
static void Main() {
ICar car = new ShowRoom();
IBike bike = new ShowRoom();
Console.ReadKey();
}
}위 예제에서 ShowRoom 클래스는 ICar와 IBike 두 인터페이스를 구현합니다. 두 메서드의 이름이 서로 다르기 때문에 암시적 구현으로 충분하며, public 키워드를 붙여 일반적인 방식으로 구현했습니다. 이렇게 하면 ShowRoom 타입으로도, ICar나 IBike 인터페이스 타입으로도 모든 멤버에 접근할 수 있습니다.
정리: 언제 암시적 구현을 사용할까?
- 구현하는 여러 인터페이스 간에 메서드 이름 충돌이 없을 때
- 클래스 타입과 인터페이스 타입 양쪽에서 모두 멤버에 접근 가능하게 하고 싶을 때
- 일반적인 public 메서드처럼 자연스럽게 호출되기를 원할 때
반대로, 인터페이스 멤버를 클래스의 public API에서 숨기고 싶거나, 동일한 시그니처의 멤버가 여러 인터페이스에 존재하는 경우에는 명시적 구현을 선택하는 것이 좋습니다.