[자바] 함수형 인터페이스
함수형 인터페이스(Funuctional Interface)란?
- 하나의 추상 메서드를 가지는 인터페이스
- 람다 표현식(lambda expression)이나 메서드 참조(method reference)를 사용하여 함수형 인터페이스를 구현할 수 있다.
- SAM(Single Abstract Method) 인터페이스
- @FuncationInterface 어노테이션을 가지고 있는 인터페이스
자바에서 제공하는 함수형 인터페이스 중 하나인 Function<T, R>은 다음과 같이 정의된다.
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
위 코드에서는 하나의 추상 메서드인 apply() 메서드를 가지는 인터페이스를 정의하고, @FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시하고 있습니다.
Java에서 제공하는 함수형 인터페이스
1. Function<T, R>
- T 타입의 값을 받아서 R 타입으로 변환하는 함수를 나타내는 함수형 인터페이스
- apply() 메서드를 가지고 있으며, 입력값을 받아서 결과값을 반환
예시) 문자열을 정수로 변환하는 Function
Function<String, Integer> stringToInt = (String s)
-> Integer.parseInt(s); int result = stringToInt.apply("123"); // 123
2. BiFunction<T, U, R>
- T와 U 두 개의 값을 받아서 R 타입으로 변환하는 함수를 나타내는 함수형 인터페이스
- apply() 메서드를 가지고 있으며, 두 개의 입력값을 받아서 결과값을 반환
예시) 두 개의 정수를 더하는 BiFunction
BiFunction<Integer, Integer, Integer> add = (Integer x, Integer y)
-> x + y; int result = add.apply(1, 2); // 3
3. Consumer<T>
- T 타입의 값을 받아서 소비하는 함수를 나타내는 함수형 인터페이스
- accept() 메서드를 가지고 있으며, 입력값을 받아서 소비
예시) 문자열을 출력하는 Consumer
Consumer<String> printString = (String s)
-> System.out.println(s); printString.accept("Hello, World!"); // Hello, World!
4. Supplier<T>
- T 타입의 값을 제공하는 함수를 나타내는 함수형 인터페이스
- get() 메서드를 가지고 있으며, 값을 제공
예시) 현재 시간을 제공하는 Supplier
Supplier<Date> getCurrentTime = () -> new Date(); Date currentTime = getCurrentTime.get(); // 현재 시간
5. Predicate<T>
- T 타입의 값을 받아서 boolean 값을 반환하는 함수를 나타내는 함수형 인터페이스
- test() 메서드를 가지고 있으며, 입력값을 받아서 boolean 값을 반환
- Predicate.not() 메소드를 통해 값이 False일 때 통과되는 함수를 구현할 수 있다.
예시) 정수가 짝수인지 확인하는 Predicate
Predicate<Integer> isEven = (Integer i) -> i % 2 == 0; boolean result = isEven.test(4); // true
6. UnaryOperator<T>
- T 타입의 값을 받아서 T 타입으로 반환하는 함수를 나타내는 함수형 인터페이스
- apply() 메서드를 가지고 있으며, 입력값을 받아서 결과값을 반환
예시) 정수를 제곱하는 UnaryOperator
UnaryOperator<Integer> square = (Integer i) -> i * i; int result = square.apply(3); // 9
7. BinaryOperator<T>
- 두 개의 T 타입의 값을 받아서 T 타입의 값을 반환하는 함수형 인터페이스
- apply() 메서드를 가지고 있다.
- BiFunction<T, T, T>와 같은 역할을 한다.
예시) 람다 표현식을 사용하여 두 정수를 더하는 BinaryOperator 구현
BinaryOperator<Integer> add = (Integer x, Integer y) -> x + y; System.out.println(add.apply(3, 5)); // 출력: 8
+ 추가 (함수)
function2.compose(function1) // function1 계산결과로 function2를 계산한다.
function1.andThen(function2) // function1 계산후 function2를 계산한다.
자바와 함수형 프로그래밍
- 함수를 First class object로 사용할 수 있다.
- 순수 함수 (Pure function)
사이드 이팩트가 없다. (함수 밖에 있는 값을 변경하지 않는다.)
상태가 없다. (함수 밖에 있는 값을 사용하지 않는다.)
- 고차 함수 (Higher-Order Function)
함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
- 불변성