모던자바를 공부하다가
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 이후에도, 기본적으로 인터페이스 메서드는 다음과 같이 분류됩니다:
- 추상 메서드 (Abstract Method):
- 구현 클래스가 반드시 구현해야 합니다.
- abstract 키워드가 명시적으로 없어도 기본적으로 추상 메서드로 간주됩니다. // 즉, 있어도 되고, 없어도 됩니다.
- 디폴트 메서드 (Default Method):
- default 키워드로 선언됩니다.
- 인터페이스 내에서 기본 구현을 제공하며, 필요 시 구현 클래스에서 재정의할 수 있습니다.
- 정적 메서드 (Static Method):
- static 키워드로 선언됩니다.
- 인터페이스 자체에서 호출 가능하며, 구현 클래스와 무관합니다.
- 정적 메서드는 인터페이스나 클래스의 인스턴스가 아닌 클래스 이름 혹은 인터페이스 이름을 통해 호출됩니다.
- Private 메서드 (Java 9 이후):
- private 키워드로 선언됩니다.
- 인터페이스 내부에서만 사용되는 유틸리티 메서드로 사용됩니다.
결론 : 따라서 test 메서드는 Predicate를 구현하는 모든 클래스나 람다 표현식에서 반드시 구현해야 하는 "추상 메서드"로 작동합니다.
'programming > JAVA' 카테고리의 다른 글
Runnable과 Callable의 차이 (0) | 2025.01.18 |
---|---|
람다에서 표현식과 구문의 차이 (0) | 2025.01.18 |
java) comparable, comparator의 비교 (0) | 2024.12.04 |
checked/unchecked Exception / @Transactional rollback (0) | 2023.05.06 |
자바의정석 14장. Optional 정리 (0) | 2022.02.24 |
댓글