Java

[자바] 함수형 인터페이스

문승주 2023. 3. 21. 12:30
반응형

함수형 인터페이스(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)

   함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.

- 불변성

 

반응형