함수형 인터페이스 : 추상 메서드가 1개인 인터페이스
함수형 인터페이스는 '추상 메서드가 1개인 인터페이스' 라는 조건만 성립하면 되기에 default method 가 추가되어도 상관없다.
@FunctionalInterface
public interface FuncInterface {
int plusTen(int num); //abstract 자동 생략
default void printHello() {
System.out.println("Hello");
}
default void printHiHello() {
System.out.println("HiHello");
}
}
@FunctionalInterface 라는 애노테이션은 함수형 인터페이스를 만들기 위해 필수적인 애노테이션은 아니다.
해당 인터페이스가 함수형 인터페이스인지 검사해주는 애노테이션이다.
public class Practice {
public static void main(String[] args) {
FuncInterface fi = new FuncInterface() {
@Override
public int plusTen(int n) {
return n + 10;
}
};
//FuncInterface fi = n -> {n + 10;};
System.out.println(fi.plusTen(10));
}
}
람다식을 사용하여 익명 클래스를 짧게 표현할 수 있다.
함수형 프로그래밍
순수 함수형 프로그래밍을 한다면 side effect 가 없다.
순수 함수형 프로그래밍으로 수학적인 함수를 만들 수 있는데 수학적인 함수란 입력받은 값이 같다면 결과 값이 항상 같은 함수를 말한다.
=> 멀티 스레딩 시 안전
함수를 First class object 로 사용이 가능하다.
함수를 매개변수로 받거나 리턴할 수도 있다.
public class Practice {
public static void main(String[] args) {
plusFive(n -> {return n + 10;}, 10);
}
public static void plusFive(FuncInterface fi, int a) {
fi.plusTen(a);
System.out.println(fi.plusTen(a));
}
}
자바가 제공하는 함수형 인터페이스
1. Function<T, R> : T 타입을 받아서 R 타입을 반환
2. Consumer<T> : T 타입을 받고 반환 X
3. Supplier<T> : 매개변수 X, T 타입 반환
4. Predicate<T> : T 타입을 받아서 boolean 반환
5. Runnable : 매개변수 X, 반환 X
6. Operator<T> : T 타입 받고 T 타입 반환
자주 보이는 것들 위주로 적었다.
여기에 쓰이지 않은 인터페이스들은 대부분 파생형태라 쉽게 사용법을 짐작할 수 있을 것이다.
Iterator<E> 의 default method 이다
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
여기서 <? super E> 가 의미하는 것은 E 와 E의 부모타입만 받겠다는 뜻이다.
<? extends E> 는 super 와 반대로 E 와 E의 자식타입만 받겠다는 뜻이다.
'Java > Java 8' 카테고리의 다른 글
Stream (0) | 2024.07.29 |
---|---|
Optional 의 등장 배경과 주의 사항 (0) | 2024.07.24 |
기존 인터페이스와 Java 8 의 인터페이스 (0) | 2024.07.18 |