공부/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. 구현의 유연성. 람다 표현식으로 익명 객체를 바로 생성할 수 있어 객체 지향 프로그래밍에서의 복잡함을 줄일 수 있다.

 

반응형