작성
·
341
1
Foo, Bar 인터페이스에서 printUppercase 라는 default 메소드로 각각 정의후
DefaultFoo에서 Foo, Bar를 implements 하였는데 영상처럼 컴파일 오류가 나지않습니다.
현재 자바 11을 사용중인데 자바11에서는 인터페이스의 디폴트 메소드의 사용법? 이 재정의 된건가요?
답변 5
3
코드가 강의 중에 바뀌면서 햇갈리게 만들어 진것 같은데요.
// Foo.java
public interface Foo {
default void hello() {
System.out.println("foo");
}
}
// Bar.java
public interface Bar {
default void hello() {
System.out.println("bar");
}
}
이 상태에서 App.java를 이렇게 만들면.. 강의에서 설명드린대로 양쪽 중에 어느쪽에 들어이는 hello() 써야 하는지 애매하기 때문에 컴파일에러가 나고 App에서 overriding해서 쓰는걸 권장하는 겁니다.
public class App implements Foo, Bar {
}
그런데 컴파일 에러가 안나고 있다고 하시는 분들은 Foo나 Bar에서 한쪽을 상속 받고 있을 겁니다. 이런식으로요.
// Foo.jav
public interface Foo extends Bar{
default void hello() {
System.out.println("foo");
}
}
이러면 App.java에서 컴파일 에러가 나지 않을텐데 이유는 Foo에서 Bar를 상속받아 hello를 오버라이딩 했다고 생각하기 때문에 App에서 Foo랑 Bar를 둘 다 구현하더라도 결국에 Foo에 있는 것을 쓰게 됩니다. 즉 App 입장에서는 Bar가 불필요하게 선언된 것으로 간주할 뿐 컴파일 에러는 아니게 되는거죠.
1
0
각각의 인터페이스가 따로인데 같은 이름의 디폴트 메소드를 정의할때는 컴파일 에러가 나는데 그게 아니라 상속관계일경우 어느 한쪽을 오버라이딩 했다고 생각해서 컴파일에러가 발생하지 않는다는 말씀이시죠?
0
저도 동일한 현상이 나타납니다.
https://github.com/kim9x/java8to11/tree/main/src/main/java/me/pulpury/java8to11
위 url은 github 주소입니다.
관련 파일은 'App.java', 'Bar,java', 'DefaultFoo.java', 'Foo2.java' 입니다.
구현하는 곳인 'App.java'에서 DefaultFoo 인스턴스를 담아주는 타입이 Foo2냐 Bar에 따라 다른 값이 나오는 것 같긴한데.. 왜 compile 에러가 나지 않았던 것인지 알고 싶습니다.!
0
https://github.com/m3252/java8apis/tree/master/src/main/java/interfaceChange 주소에 있습니다!