반응형

 

public class Practice implements A, B {
	...
}

interface A {
    default void print() {
        System.out.println("hi");
    }
}

interface B {
    default void print() {
        System.out.println("hello");
    }
}

위처럼 Practice가 구현하는 A, B 인터페이스가 동일한 시그니쳐의 default 메서드를 가지면 어떻게 될까? 라는 궁금증이 생겼습니다.

 

확인해보니 아래와 같은 에러가 발생합니다.

A와 B로부터 연결되지 않은 default 메서드들을 상속받았다는 것입니다.

 

public class Practice implements A, B {

    @Override
    public void print() {
        A.super.print();
    }
}

위와 같이 Overrinding을 통해 해결해야 합니다.

 

public class Practice implements A, B {

    @Override
    public void print() {
        A.super.print();
    }
}

interface A {
    default void print() {
        System.out.println("hi");
    }
}

interface B {
    default int print() {	// 반환 타입만 다름
        System.out.println("hello");
    }
}

 위처럼 인자는 같은데 반환타입만 다른 경우는, 충돌이 해결되지 않습니다.

 

public class Practice implements A, B {
    
}

interface A {
    default void print() {
        System.out.println("hi");
    }
}

interface B {
    default void print(int a) {
        System.out.println(a);
    }
}

위처럼 (반환타입과 관계 없이) 인자가 다른 경우는, Overring을 하지 않아도 됩니다.

클래스 생성 시에 Overloading이 되는 것으로 생각됩니다.

 


Java는 클래스의 다중 상속을 지원하지 않는데, Interface의 다중 상속(구현)은 가능합니다.

이는 Interface가 메서드의 구현이 없는 껍데기만 존재하기 때문에, 다중 상속에서 발생할 수 있는 충돌 문제로부터 안전하다고 판단했기 때문인데요,

 

편리함을 위해 추가한 Interface의 Default 메서드가 충돌의 원인이 될 수 있다는 것을 알았습니다.

편리함에는 항상 대가가 따르는 것 같습니다.

 

 

 

 

 

 

 

반응형

+ Recent posts