multiple non-overriding abstract methods found

·2025년 4월 22일

java: incompatible types: ch14.MyFunction is not a functional interface
multiple non-overriding abstract methods found in interface ch14.MyFunction

@FunctionalInterface
interface MyFunction {
   void method1();
   void method2(); // 두 개의 추상 메서드 → 오류 발생
}

함수형 인터페이스는 추상 메서드가 반드시 하나만 존재해야 하며, 이 조건을 위반하면 컴파일러가 발생한다.

함수형 인터페이스 조건

  • 추상 메서드가 오직 하나여야 한다.
  • default 메서드나 static 메서드는 개수에 상관없이 추가할 수 있다.
    (이들은 추상 메서드 개수에 영향을 주지 않음).
  • @FunctionalInterface 어노테이션은 선택사항이지만, 붙이면 컴파일러가 조건을 강제한다.

해결 방법

  • 추상 메서드를 하나만 남기고 나머지는 제거.
  • default나 static 메서드만 추가하는 것은 문제없다.

예시 (정상):

@FunctionalInterface
interface MyFunction {
    void method1(); // 추상 메서드 하나만 존재
    default void method2() { } // default 메서드는 허용
}

예시 (에러발생)

interface MyFunction {
    public abstract int max(int a, int b);
    public int min(int a, int b) { // 에러 발생
        return Math.min(a,b);
    }
}

위 코드에서 public int min(int a, int b) { ... }안 되는 이유는,
인터페이스에서 구현(몸체)이 있는 메서드는 반드시 default 또는 static 키워드를 사용해야 하기 때문입니다. 왜? 그냥 자바 규칙이다.

1. 인터페이스의 메서드 종류

  • 추상 메서드: 선언만 있고 구현(몸체)이 없는 메서드.
    예: int max(int a, int b);
  • default 메서드: 구현이 있는 인스턴스 메서드.
    예: default int min(int a, int b) { ... }
  • static 메서드: 구현이 있는 정적 메서드.
    예: static int util(int a) { ... }

2. 왜 public int min(...) { ... }는 안 되는가?

  • Java 8 이전에는 인터페이스에 구현이 있는 메서드(몸체가 있는 메서드)를 선언할 수 없었습니다.
  • Java 8부터 default 또는 static 키워드를 붙이면 구현이 있는 메서드를 인터페이스에 선언할 수 있습니다.
  • 키워드 없이 구현이 있는 메서드를 선언하면 문법 오류가 발생합니다[8][6][12].

인터페이스에서 구현부가 있는 메서드는 반드시 default 또는 static으로 선언해야 합니다.

3. 올바른 예시

interface MyFunction {
    int max(int a, int b); // 추상 메서드
    default int min(int a, int b) { // default 메서드
        return Math.min(a, b);
    }
}
profile

0개의 댓글