클래스가 인터페이스를 상속하는 경우 인터페이스가 가지는 메소드들을 구현해야 합니다.
이때, 구현하는 방법은 암묵적 구현과 명시적 구현이 있습니다.
간단히 말하자면,
암묵적 구현은 public으로 구현하는 방식이고,
명시적 구현은 접근 한정자를 지정해주지 않고 [void 인터페이스명.메소드명] 형식으로 메소드를 구현하는 방식입니다.
이제 한번 암묵적 구현과 명시적 구현에 대해 알아보겠습니다!
암묵적 구현
public을 사용해서 구현하는 방식을 암묵적 구현이라고 합니다.
암묵적 구현은 외부에서 객체를 통해 쉽게 접근이 가능합니다.
명시적 구현
[void 인터페이스명.메소드명]으로 구현하는 방식을 명시적 구현이라고 합니다.
private 하기 때문에 외부에서 객체를 호출 할 수 없습니다.
메소드 뿐만 아니라 필드도 명시적 구현으로 구현할 수 있습니다.
접근 방법
암묵적 구현은 다른 클래스에서 객체를 통해 쉽게 메소드에 접근할 수 있습니다.
하지만, 명시적 구현은 다른 클래스에서 객체를 통해 직접 접근 시 오류가 나는 것을 볼 수 있습니다.
명시적 구현으로 구현한 메소드를 접근하는 방법은 인터페이스를 참조하여 접근할 수 있고,
인터페이스로 업캐스팅 한 후 접근할 수 있습니다.
위의 코드에서 ITest_Interface 인터페이스를 참조하여 명시적 구현으로 구현한 메소드를 사용하거나,
test6 인스턴스를 ITest_Explict 인터페이스로 업캐스팅 하여 명시적 구현으로 구현한 메소드를 사용했습니다.
명시적 구현은 클래스가 인터페이스를 구현할 때, 모든 메서드를 public하게 공개할 필요가 없을 때 사용할 수 있습니다.
또, 인터페이스는 중복 상속이 되기 때문에, 한 클래스에서 상속한 인터페이스들 중에서 서로 다른 인터페이스가 같은 이름의 메소드를 가질 수도 있습니다.
여기 두 개의 인터페이스를 보면 name이라는 프로퍼티와 TestInterface 메소드 이름이 같습니다.
이런 경우에 명시적 구현을 하면 각 인터페이스를 다른 메소드로 구현 할 수 있습니다.
[그림 1]을 보면 Test6 클래스를 명시적 구현으로 ITest_Interface와 ITest_Explict를 서로 다른 메소드로 구현했습니다.
디버깅 해서 프로퍼티도 살펴봤습니다.
[그림 2]에서 itest6는 ITest_Interface를 참조하기 때문에 명시적 구현한 프로퍼티에 접근할 수 있습니다.
[그림 1]에서 ITest_Interface 프로퍼티는 자동 구현 프로퍼티로 구현해놨고, ITest_Explict 프로퍼티는 name을 호출하면 "명시적 구현"을 호출하도록 구현했습니다.
itest6.name에 "인터페이스 테스트"로 set 했습니다. itest6는 ITest_Interface를 참조하기 때문에 ITest_Interface.name에 "인터페이스 테스트"가 들어가야 맞습니다.
디버깅 결과를 보면,
ITest_Interface.name은 "인터페이스 테스트"를 가져오고,
ITest_Explict.name은 "명시적 구현"을 가져옵니다.
출력 결과도 각 프로퍼티에 있는 값을 잘 출력합니다.
이렇게 한 클래스에서 상속한 인터페이스들 중에서 프로퍼티나 메소드 명이 같을 때,
명시적 구현을 해야 각 인터페이스의 프로퍼티나 메소드를 서로 다른 기능으로 오버라이딩 할 수 있습니다.
제가 공부한 부분을 정리한 내용이기 때문에 틀린 부분 있을 수 있습니다!!
혹시 틀린 부분이 있으면 알려주세요!!
'C#' 카테고리의 다른 글
[C#] 다형성, virtual과 override (0) | 2022.09.06 |
---|---|
[C#] 상속을 해보자 (0) | 2022.08.27 |
[C#] 추상 클래스와 인터페이스 (0) | 2022.08.19 |
[C#] 객체지향 언어에 대하여(OOP) (0) | 2022.08.10 |
[C#] CopyTo를 사용하자 (0) | 2022.07.27 |