Section 41.2: 명시적인 인터페이스 구현 (implementation) 방법

공통의 메소드를 갖는 복수개의 인터페이스를 구현 (implement) 할 때, 해당 메소드를 호출하기 위해 어느 인터페이스가 사용되었는지에 따라 각기 다른 구현 내용이 제공되어야 한다면 명시적인 인터페이스 구현 방법을 사용하여야 한다. (만약 복수개의 인터페이스가 동일한 메소드를 갖지만 공통의 구현 내용을 제공하는 것이 가능하다면 굳이 명시적 인터페이스 구현 방법을 사용할 필요는 없다).

역주: 아래 예제에서 사용된 Chauffeur 라는 단어는 "운전기사" 를 지칭한다고 합니다.

interface IChauffeur { string Drive(); } interface IGolfPlayer { string Drive(); } class GolfingChauffeur: IChauffeur, IGolfPlayer { public string Drive() { return "Vroom!"; } string IGolfPlayer.Drive() { return "Took a swing..."; } } GolfingChauffeur obj = new GolfingChauffeur(); IChauffeur chauffeur = obj; IGolfPlayer golfer = obj; Console.WriteLine(obj.Drive()); // Vroom! Console.WriteLine(chauffeur.Drive()); // Vroom! Console.WriteLine(golfer.Drive()); // Took a swing...

이렇게 제공된 명시적 구현 내용은 해당 인터페이스를 통하지 않고는 호출이 불가능하다:

public class Golfer: IGolfPlayer { string IGolfPlayer.Drive() { return "Swinging hard..."; } public void Swing() { Drive(); // 컴파일 에러 : 존재하지 않는 메소드 } }

따라서, 명시적 인터페이스 구현 방법을 이용한 복잡한 코드는 별도의 private 메소드로 분리해 두는 것이 유리할 수 있다.

또한, 명시적 인터페이스 구현 방법은 당연하게도 해당 인터페이스에 실제로 존재하는 메소드에 대해서만 사용할 수 있다:

public class ProGolfer: IGolfPlayer { string IGolfPlayer.Swear() // 에러 { return "The ball is in the pit"; } }

유사하게, 클래스에 인터페이스를 선언하지 않은 채 해당 인터페이스에 대한 명시적 인터페이스 구현 방법을 사용하는 것 역시 에러를 발생시킬 것이다.

힌트:

명시적으로 인터페이스를 구현하는 방식은 더 이상 사용되지 않는 죽은 코드 (dead code) 방지를 위해서도 사용될 수 있다. 특정 메소드가 더 이상 필요하지 않아 인터페이스에서 제거될 경우, 컴파일러는 불필요하게 남아있는 구현부의 존재에 대해 알려줄 것이다.

유의사항:

프로그래머들은 인터페이스에 대한 계약 (contract) 이 타입에 대한 문맥에 관계 없이 동일하며 명시적 구현 내용이 호출시마다 다른 동작을 보여주지 않기를 기대할 것이다. 따라서 위 예제와는 다르게, IGolfPlayer.DriveDrive 가 동일한 동작을 수행할 수 있다면 그렇게 하는 것이 바람직하다.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts