공부/Java Kotlin
[Java] Functional Interface
달나라 개발자
2025. 4. 16. 18:51
반응형
정의
Functional Interface는 Java8에서 도입된 개념이며 하나의 추상 메서드만 가지고 있는 인터페이스이다.
하지만 default 메서드나, static 메서드는 여러개 가질 수 있다.
사용
Java8에서 @FunctionalInterface 어노테이션을 사용하여 Functional Interface를 명시적으로 나타낼 수 있다.
어노테이션을 사용하는 것은 선택적이지만, 어노테이션을 사용했을 때, 컴파일러가 추상 메서드를 1개만 가지고 있는지 확인해주기 때문에 안정성을 높일 수 있다.
Functional Interface는 람다 표현식과 함께 사용되며, 코드를 간결하게 만들 수 있다.
@FunctionalInterface
public interface Calculator{
int add(int a, int b);
}
public class Test{
public void test(){
Calculator calculator = (a,b) -> a + b;
calculator.add(1,2); // 결과값 3
}
}
이와 같이 코드를 나타낼 수 있다.
java.util.function
java8부터는 java.util.function 패키지가 제공되며, 여기에는 functional interface가 정의되어있다.
Predicate<T>
매개변수 T를 받아 boolean을 반환하는 test 메서드가 있다.
@FunctionalInterface
public interface Predicate<T>{
boolean test(T t);
}
public class Test{
public void method1(){
Predicate<Integer> isPositive = num -> num > 0;
isPositive.test(5); // true
isPositive.test(-1); // false
}
}
Function<T, R>
매개변수를 T를 받아 결과값 R을 반환한다.
@FunctionalInterface
public interface Function<T, R>{
R apply(T t);
}
public class Test{
public void method1(){
Function<String, Integer> stringLength = str -> str.length();
stringLength.apply("hello world."); // 12
}
}
Consumer<T>
매개변수 T를 받아 로직을 처리하고 결과는 반환하지 않는다.
@FunctionalInterface
public interface Consumer<T>{
void accept(T t);
}
public class Test{
public void method1(){
Function<String> printer = message -> System.out.println(message);
message.accept("hello world"); // hello world 문자열 출력
}
}
Supplier<T>
매개변수를 받지 않고, 결과 T를 반환한다.
@FunctionalInterface
public interface Supplier<T> {
T get();
}
public class Test{
public void method1(){
Supplier<String> printer = () -> "Test message";
printer.get(); // Test message
}
}
장점
1. 간결하고 읽기 쉬운 코드. 람다 표현식과 함께 사용하면 코드가 간결해지고 가독성이 좋아진다.
2. 함수형 프로그래밍 지원. Java8부터 함수형 프로그래밍을 지원하며 컬렉션 처리, 스트림 API, 병렬 처리 등을 활용할 수 있다.
3. 구현의 유연성. 람다 표현식으로 익명 객체를 바로 생성할 수 있어 객체 지향 프로그래밍에서의 복잡함을 줄일 수 있다.
반응형