인터페이스를 구현하면 상속이라고합니까?


31

내 수업 implements이 인터페이스라면 상속을 따르고 있다고 말할 수 있습니까? 나는 클래스가 extends다른 클래스라면 상속 이라는 것을 알고 있습니다.



7
Jodrell의 의견은 단순히 잘못되었습니다. 인터페이스 구현은 실제로 상속이며 한 인터페이스를 다른 인터페이스에서 상속하는 것이 상속입니다. 우리가 어떻게 알아? 우리가 사용하는 단어를 정의함으로써. 상속 은 한 유형의 상속 가능한 멤버가 다른 유형의 멤버라는 속성입니다. 이 정의에 따르면, 인터페이스를 구현하는 클래스는 모든 인터페이스의 메소드를 상속했습니다. 클래스와 인터페이스를 보면 올바른 프로그램에서 동일한 멤버를 가지고 있음을 알 수 있습니다.
Eric Lippert

나는 체크하지 않고 더 혼란스러워했다.
RajeeV VenkaT

18
그만한 가치가 있기 때문에, 당신은 많은 이익을 얻지 못할 단어 정의에 많은 시간을 보내고 있다고 생각합니다. 하루가 끝나면 인터페이스를 구현하는 것이 무엇을 의미하는지, 그리고 "상속성"으로 간주되는지 여부는 일상 업무에 크게 영향을 미치지 않습니다.
Robert Harvey

3
나는 (주로) Robert에 동의합니다. 전문 용어가 다양한 맥락에서 사용되는 정확한 기술적 의미를 이해하는 데 실질적인 가치가 있다고 생각합니다. 그러나 Robert는 실질적인 영향을 이해하는 것이 훨씬 더 큰 이점이라고 생각합니다! 상속을 사용하여 코드를 더 안전하게 만드는 방법은 무엇입니까? 더 테스트 가능? 더 재사용 할 수 있습니까? 더 유연합니까? 등등. 기본 유형의 멤버도 파생 된 유형의 멤버라는 것을 아는 것이 좋지만 효과적으로 사용하는 방법을 아는 것이 좋습니다.
Eric Lippert

답변:


78

업데이트 :이 답변을 수정했습니다. 부를 가치가있는 의견에서 여러 가지 좋은 점이 제기되었습니다.

내 클래스가 인터페이스를 구현하면 상속을 따르고 있다고 말할 수 있습니까?

"상속을 따른다"라는 말의 의미가 완전히 명확하지는 않습니다. 약간 다른 질문을하겠습니다.

상속이란 무엇입니까?

  • 한 유형 X의 구성원이 다른 유형 Y의 구성원으로 간주되면 Y의 해당 구성원은 X에서 상속됩니다 .
  • 일부 유형 간에는 상속 관계가 있습니다. 즉, 일부 유형 X 및 Y의 경우 "Y는 X에서 상속됩니다"라고 말합니다.

이들은 미묘하게 다릅니다. 혼란 스럽기 때문에 불행합니다.

이 미묘한 차이로 인해 일반적으로 어떤 혼란이 발생합니까?

사람들이 상속을 구현 세부 사항을 공유하는 메커니즘으로 생각하기 때문에 혼란이 발생할 수 있습니다. 그것이 비록 입니다 이러한 메커니즘은, 그 메커니즘을 공유하여 작동 회원 . 해당 멤버는 구현이 필요하지 않습니다! 우리가 볼 수 있듯이, 그것들은 추상적 일 수 있습니다.

이 혼동을 피하기 위해 Java와 C # 스펙이 인터페이스 메소드와 클래스 간의 관계를 설명하기 위해 "상속"이외의 단어를 사용한 경우 개인적으로 더 행복 할 것입니다. 그러나 그것들은 그렇지 않으며, 우리는 사양에 반대 하지 않고 사양 에서 추론 해야합니다.

Java에서는 인터페이스 멤버를 구현하는 클래스가 인터페이스 멤버를 상속합니까?

예, 일부는 있습니다. 편의를 위해 여기에 인용 한 Java 사양 섹션 8.4.8을 참조하십시오.

클래스 C는 직접 수퍼 클래스와 직접 수퍼 인터페이스를 상속받으며 다음의 모든 것이 참인 추상 및 기본 메소드 m : [...]

클래스가 인터페이스를 구현한다고하면 클래스는 해당 인터페이스 의 추상 및 기본 메소드를 상속합니다 . (물론, 다음 조건을 생략했습니다. 자세한 내용은 사양을 참조하십시오. 특히, 인터페이스의 멤버를 구현하는 클래스는 해당 멤버를 상속 한 것으로 간주 되지 않습니다 . 다시 말하지만 혼란 스럽습니까?)

우리는 일반적으로 자바에서 클래스가 인터페이스에서 상속한다고 말합니까?

일반적으로 클래스 가 인터페이스를 구현 한다고 말합니다 . 위에서 언급했듯이 클래스는 인터페이스에서 멤버 를 상속 할 수 있지만 여전히 인터페이스에서 상속한다고는 말할 수 없습니다. 혼란 스럽습니다.

이 미묘한 차이가 일상적인 일에서 중요합니까?

일반적으로 그렇지 않습니다. 이러한 종류의 사양 분석은 라인업 개발자보다 컴파일러 작성자에게 더 유용합니다. "상속"의 정확한 정의를 얻는 것보다 인터페이스 사용시기를 이해하는 것이 더 중요합니다.


4
정식 참조로 논쟁 할 수는 없습니다. 사양이 반드시 다르듯이 간단한 용어는 의미 상 과부하되어 문맥 상 모호합니다. 질문이 태그되어 java영업 이익은 다른 의미하지 않는이, 정답 그래서 java:-)
Jodrell

5
질문에 Java 태그가 붙어 있지만 일반적인 용어에 대한 언어 사양을 인용하는 것은 문제가 있습니다. 많은 언어에는 인터페이스가 있으며 언어 사양에 다른 용어가 사용될 수 있으므로 X-Lang을 사용하는 개발자와 대화 할 때 Java 관련 용어를 사용하면 혼동 될 수 있습니다.
Thomas Owens

5
@ThomasOwens :이 시나리오는 일반적이며 귀하의 결론에 완전히 동의하지 않습니다. 설명하는 의사 소통 문제에 대한 해결책 은 관련 컨텍스트에서 단어의 정확한 의미에 대해 관련된 모든 사람을 교육하는 것입니다 . 이러한 명확성을 제공하기위한 사양이 있습니다. 그것을 써!
Eric Lippert

5
Java 언어 사양이 여기에 최종적으로 언급되는 이유는 무엇입니까? 언어 사양은 종종 "일반 개발자"가 용어에 대해 동의하지 않는 것을 주장합니다.
Benjamin Gruenbaum

5
@ BenjaminGruenbaum : 모르겠어요. 그 개발자들은 틀 렸으며, 종종 다른 사람들을 그들의 잘못된 믿음에 대해 "교육"하기 위해 스스로를 받아들입니다. 필자는 저자가 VB, C #, JavaScript 등에 대해 완전히 미친 믿음을 가지고 있기 때문에 내가 고쳐야했던 프로그래밍 언어 서적의 수를 믿지 않을 것입니다. (존 소총 그들 가운데 아니었다 깊이에서 C #을 내가 책에 이렇게 몇 가지 의견을하지 않은 여전히 지불을지 마십시오 처음부터 정확했다!.)
에릭 Lippert의

26

상속 은 수퍼 클래스에 대한 새로운 서브 클래스를 작성하는 것을 의미합니다. 인터페이스에 대해 새 클래스를 작성하면 해당 인터페이스가 구현 됩니다. 이전 인터페이스를 기반으로 새 인터페이스를 작성하면 해당 인터페이스 가 확장 됩니다.

세 가지 가능성 모두에 적용되는 유일한 올바른 용어는 subtyping 입니다. 모든 하위 유형이 하위 클래스 인 것은 아닙니다.


1
GoF 서적 은 하위 유형을 설명하기 위해 인터페이스 상속에 적절한 용어를 고려하는 것 같습니다 (섹션 1.6 클래스 대 인터페이스 상속)
gnat

"저는 한때 James Gosling (Java의 발명가)이 주요 연사였던 Java 사용자 그룹 회의에 참석했습니다. 기억에 남는 Q & A 세션에서 누군가가 그에게 물었습니다."Java를 다시 할 수 있다면 무엇을 바꾸겠습니까? " 그는 "클래스를 제외하라"며 "실제 문제는 클래스 자체가 아니라 구현 상속 (관계 확장)이라고 설명했다. 인터페이스 상속 (구현 관계)이 바람직하다. 가능할 때마다 구현 상속을 피해야한다"고 덧붙였다. javaworld.com/article/2073649/core-java/…
ricardoramos

1

서브 클래스 , 당신

  • 수퍼 클래스의 상태 상속
  • 실제 구현을 상속합니다 (추상적이지 않은 모든 메소드)

인터페이스를 사용 하면 선언 된 메소드 를 구현 하여 계약을 완료 합니다.

그것이 고전적인 방법입니다. 이제 Java 8 에서는 인터페이스가 혼합되어 있습니다.

  • 인터페이스에는 여전히 인스턴스 변수가 없으므로 상태를 상속하지 않습니다.
  • 이제 인터페이스에서 기본 구현상속 할 수 있습니다

모든 메소드가 기본 구현을 가진 인터페이스를 구현하면 여전히 '구현'또는 확장으로 계산됩니까? 나는 말할 수 없었다. 이 경우는 상당히 멀리 가져 오기 때문에 (실제로 상태 비 저장 다중 상속을 활성화) 서브 클래스에서만 '상속'을 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.