인프런 커뮤니티 질문&답변

m3252님의 프로필 이미지
m3252

작성한 질문수

더 자바, Java 8

인터페이스 기본 메소드와 스태틱 메소드

interface default 메소드 질문입니다.

작성

·

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

백기선님의 프로필 이미지
백기선
지식공유자

작성하신 코드를 공유해 주시겠어요?

m3252님의 프로필 이미지
m3252
질문자

https://github.com/m3252/java8apis/tree/master/src/main/java/interfaceChange 주소에 있습니다!

m3252님의 프로필 이미지
m3252

작성한 질문수

질문하기