삽질의 현장/- .NET

#044_닷넷(.NET)_.Net Framework 기본 - 인터페이스(일반적인 구현 & 명시적 구현)

shovelman 2015. 10. 29. 16:28


안녕하세요 삽잡이입니다.


이번 시간에는 C#의 인터페이스 사용법 중,

일반적인 구현과 명시적인 구현에 대해서 알아보려고합니다.



인터페이스를 구현하는데에는 두가지의 방법이 있습니다.

'인터페이스를 구현하되 그 인터페이스를 자신의 메서드로 만드는 방법',

'인터페이스 명시적 구현' 이라고 해서 오직 인터페이스 메서드만 구현하능 방법이 있지요...


즉, 인터페이스를 구현하면서, 소유를 내것으로 하는 방법과

오직 인터페이스를 구현하면서 내 인터페이스는 아니게하는 방법이 있다 이겁니다.


왜 이런 이야기를 했을까요...



예를 들어서 동일한 Draw() 메서드가 있다고 해보겠습니다.
인터페이스를 세개 다 구현한다고 할경우
각 인터페이스가 다른데 누구의 Draw()를 호출하는지 할 수 있을까요?
따라서 이 때에는 '명시적인 구현'이 필요합니다.


이와 같이 (1)의 Draw(), (2)의 Draw(), (3)의 Draw() 등 
명시적인 인터페이스를 구현할 수 있습니다.

그런데 이 메서드들은 가시성을 사용할 수 없습니다.
무조건 interface의 메서드들이니 public이 아니겠습니까...

아무리 내 메서드처럼 보이지만,
사실 자기 인터페이스를 쓰고자할 때 형식 변환을 하여 수행하는 것이 좋습니다.
즉, 명시적인 인터페이스가 더 좋다 이겁니다...

예를 들어볼까요...


이렇게 IPoint 인터페이스를 Rect에서 구현했다고 해보겠습니다.
그러면 IPoint 인터페이스를 구현하기도,
나의 클래스의 메서드로도 사용이 가능합니다.

그런데, 


이처럼 구현하게 되면,
IPoint 인터페이스의 메서드를 구현한 것일 뿐이 됩니다.

뭔 차이가 있을까요?

Rect rt = new Rect();
를 통해 객체 생성을 하고,
전자의 경우에는 'rt.Point'를 할 경우에는 3이 return 될 것입니다.
하지만, 후자의 경우 '(IPoint)rt.Point' 와 같이 형식 변환을 해줘야합니다.
내 것이 아니기 때문입니다.

후자가 더 좋은 것입니다.
왜냐, 우리는 코드를 명시적이지 않고 
추상적으로 다루고자 하는 객체지향의 목적을 잃으시면 안됩니다.

이번 시간은 여기까지 하도록 하겠습니다.

이상 삽잡이였습니다!