[java] 인터페이스가 다른 인터페이스를 구현할 수없는 이유는 무엇입니까?

내가 말하고 싶은 건:

interface B {...}

interface A extends B {...} // allowed  

interface A implements B {...} // not allowed

나는 그것을 봤는데 이것을 발견 했다 .

implements인터페이스의 메소드에 대한 구현을 정의하는 것을 나타냅니다. 그러나 인터페이스에는 구현이 없으므로 불가능합니다.

그러나 인터페이스는 100 % 추상 클래스이고 추상 클래스는 메서드를 구현하지 않고도 인터페이스 (100 % 추상 클래스)를 구현할 수 있습니다. “인터페이스”로 정의 할 때 문제는 무엇입니까?

세부적으로

interface A {
    void methodA();
}

abstract class B implements A {} // we may not implement methodA() but allowed

class C extends B {
   void methodA(){}
}

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B



답변

implements구현을 interface의미 interface하지 않습니다.

100 % abstract class는 기능적으로는과 동일 interface하지만 원하는 경우 구현할 수도 있습니다 (이 경우 100 %로 유지되지 않음 abstract). 따라서 JVM의 관점에서 보면 서로 다릅니다.

또한 100 % 추상 클래스의 멤버 변수는 모든 액세스 한정자를 가질 수 있으며, 인터페이스에서는 암시 적으로 public static final있습니다.


답변

implements동작이 abstract메서드에 대해 정의된다는 것을 의미합니다 (분명히 추상 클래스 제외). 구현을 정의합니다.

extends 행동이 상속됨을 의미합니다.

인터페이스를 사용하면 한 인터페이스가 다른 인터페이스와 동일한 동작을 가져야한다고 말할 수 있으며 실제 구현도 없습니다. 그렇기 때문에 extends구현하는 대신 다른 인터페이스 에 대한 인터페이스가 더 합리적입니다 .


참고로, abstract클래스가 abstract메서드 를 정의 할 수 있다고해도 (인터페이스의 정상적인 방식) 여전히 클래스 이며 상속 (확장)되어야하며 구현되지 않아야합니다.


답변

개념적으로 두 개의 “도메인”클래스와 인터페이스가 있습니다. 이러한 도메인 내에서는 항상 확장하고 있으며 클래스 만 “국경을 넘나 드는”인터페이스를 구현합니다. 따라서 기본적으로 인터페이스에 대한 “확장”은 클래스의 동작을 반영합니다. 적어도 나는 이것이 논리라고 생각합니다. 모든 사람들이 이런 종류의 논리에 동의하는 것은 아닌 것 같습니다.


답변

그러나 인터페이스는 100 % 추상 클래스이고 추상 클래스는 메서드를 구현하지 않고도 인터페이스 (100 % 추상 클래스)를 구현할 수 있습니다. “인터페이스”로 정의 할 때 문제는 무엇입니까?

이것은 단순히 관습의 문제입니다. 자바 언어의 작성자는 “확장”이이 관계를 설명하는 가장 좋은 방법이라고 결정했기 때문에 우리 모두가 사용하는 것입니다.

일반적으로 인터페이스가 “100 % 추상 클래스”라고해도 우리는 그렇게 생각하지 않습니다. 우리는 일반적으로 인터페이스를 파생 할 클래스가 아닌 특정 키 메서드를 구현하기위한 약속으로 생각합니다. 그래서 우리는 클래스보다는 인터페이스에 다른 언어를 사용하는 경향이 있습니다.

다른 사람들이 말했듯이 “구현”보다 “확장”을 선택하는 데에는 좋은 이유가 있습니다.


답변

이것이 내가 대학에서 oops (core java)에서 배운 것을 조금이라도 도울 수 있기를 바랍니다.

구현은 인터페이스의 메소드에 대한 구현을 정의하는 것을 나타냅니다. 그러나 인터페이스에는 구현이 없으므로 불가능합니다. 그러나 인터페이스는 다른 인터페이스를 확장 할 수 있습니다. 즉, 더 많은 메서드를 추가하고 해당 유형을 상속 할 수 있습니다.

여기에 아래의 예가 있습니다. 이것은 제가 이해하고 배운 것입니다.

interface ParentInterface{
        void myMethod();
}

interface SubInterface extends ParentInterface{
        void anotherMethod();
}  

그리고 하나의 인터페이스는 다른 인터페이스 만 확장 할 수 있으며 일부 클래스에서 기능을 정의하려는 경우 인터페이스 만 구현할 수 있다는 점을 명심하십시오.

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

이제 클래스가이 인터페이스를 구현하는 경우 다음과 같습니다.

public class SomeClass implements Dog
{
    public boolean Barks{
    // method definition here

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

추상 클래스에 추상 함수 정의 및 선언이 있고 해당 함수를 정의하거나 해당 함수를 구현한다고 말할 수있는 경우 추상 클래스 만 확장 할 수 있기 때문에 해당 클래스를 확장한다고 가정합니다. 여기에 예가 있습니다.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

다음은 MyAbstractClass의 예제 하위 클래스입니다.

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}


답변

인터페이스는 기능을 제공하지 않는 추상화와 같습니다. 따라서 ‘구현’하는 것이 아니라 다른 추상화 나 인터페이스를 확장합니다.


답변

Interface는 어떤 객체도 생성 할 수없는 추상 메서드를 포함하는 클래스로, 인터페이스는 객체를 생성 할 수없고 순수한 클래스가 아니므로 구현할 가치가 없습니다.