본문 바로가기
programming/JAVA

추상메서드에 abstract 키워드가 없는 이유

by buddev 2025. 1. 18.

모던자바를 공부하다가

Predicate에서의 test 인터페이스에 abstract가 왜 안붙어있는지 궁금해서 찾아본 자료입니다.

 

Java에서 Predicate<T>와 같은 함수형 인터페이스에서 "추상 메서드"로 간주되는 메서드가 abstract 키워드 없이도 추상 메서드로 취급되는 이유

 

1. 함수형 인터페이스와 추상 메서드

  • Predicate<T>는 함수형 인터페이스이며, 함수형 인터페이스는 정확히 하나의 추상 메서드를 가져야 합니다.
  • 함수형 인터페이스는 @FunctionalInterface라는 어노테이션을 사용할 수 있으며, 이는 컴파일러가 하나의 추상 메서드만 가지도록 보장해줍니다.
  • Predicate<T>의 test 메서드는 아래와 같이 선언되어 있습니다:
 
@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t); // 추상 메서드
}

 

2. 왜 abstract 키워드가 생략되었는가?

Java에서는 인터페이스에 선언된 모든 메서드는 기본적으로 abstract입니다. 따라서 인터페이스에 선언된 메서드에서 abstract 키워드는 암묵적으로 적용됩니다. (단, 디폴트 메서드 및 정적 메서드 제외)

즉, 아래 두 선언은 동일합니다.

boolean test(T t);           // `abstract` 키워드 생략
abstract boolean test(T t);  // `abstract` 키워드 명시

 

 

3. 인터페이스의 규칙

Java 8 이후에도, 기본적으로 인터페이스 메서드는 다음과 같이 분류됩니다:

  1. 추상 메서드 (Abstract Method):
    • 구현 클래스가 반드시 구현해야 합니다.
    • abstract 키워드가 명시적으로 없어도 기본적으로 추상 메서드로 간주됩니다. // 즉, 있어도 되고, 없어도 됩니다.
  2. 디폴트 메서드 (Default Method):
    • default 키워드로 선언됩니다.
    • 인터페이스 내에서 기본 구현을 제공하며, 필요 시 구현 클래스에서 재정의할 수 있습니다.
  3. 정적 메서드 (Static Method):
    • static 키워드로 선언됩니다.
    • 인터페이스 자체에서 호출 가능하며, 구현 클래스와 무관합니다.
    • 정적 메서드는 인터페이스나 클래스의 인스턴스가 아닌 클래스 이름 혹은 인터페이스 이름을 통해 호출됩니다.
  4. Private 메서드 (Java 9 이후):
    • private 키워드로 선언됩니다.
    • 인터페이스 내부에서만 사용되는 유틸리티 메서드로 사용됩니다.
 

결론 : 따라서 test 메서드는 Predicate를 구현하는 모든 클래스나 람다 표현식에서 반드시 구현해야 하는 "추상 메서드"로 작동합니다.

댓글