1년뒤의나는다르겠지

[JAVA] 함수형 인터페이스 본문

프로그래밍/JAVA

[JAVA] 함수형 인터페이스

Lirodek 2023. 8. 8. 20:15

함수형 매서드란 추상 메서드가 하나만 있는 인터페이스다.

public interface RunSomething {
    void doit();
}

함수형 매서드 관련해서 지원해주는 Annotation이 존재한다

@FunctionalInterface
public interface RunSomething {
    void doit();

}

위와 같이 @functionalInterface를 사용하면 함수형 인터페이스 규칙이 위반 되는 상황이 오면 IDE단에서 오류를 표시해준다.

public interface RunSomething {
    void doit();

    static void printName(){
        System.out.println("Gwangmin");
    }

    default void printAge(){
        System.out.println("24");
    }
}

두개 이상부터는 안된다!!
다만 추상메서드가 아닌 일반 메서드가 있는건 상관이 없다.  

public interface RunSomething {
    void doit();

    static void printName(){
        System.out.println("Gwangmin");
    }

    default void printAge(){
        System.out.println("24");
    }
}

함수형 인터페이스 활용하기 !

1. 람다 표현식을 활용한 간결한 코드
함수형 인터페이스는 람다 표현식을 사용하여 익명 함수를 정의하는 데 유용합니다. 이를 통해 코드의 길이를 줄이고 가독성을 향상시킬 수 있습니다. 함수형 인터페이스를 활용하면 별도의 클래스나 익명 클래스를 생성하지 않고도 간단한 함수를 작성할 수 있습니다. 이렇게 함으로써 코드의 간결성을 추구할 수 있습니다.

RunSomething runSomething = new RunSomething() {
    @Override
    public void doit() {

    }
};
RunSomething runSomething = () -> System.out.println("hello");

 

2. 병렬 프로그래밍의 용이성
함수형 프로그래밍은 상태 변경을 최소화하고 불변성을 강조하는 특성을 가지고 있습니다. 이는 병렬 프로그래밍을 더욱 용이하게 만들어줍니다. 함수형 인터페이스와 람다 표현식을 사용하여 스레드 안전성을 보장하면서도 병렬 처리를 간편하게 구현할 수 있습니다. 이로써 코드의 성능을 향상시키는 데 도움이 됩니다.
ThreadPool, Future등을 사용한 병렬처리 가능

3. 모듈성 강화와 재사용성
함수형 인터페이스를 활용하면 작은 함수 조각들을 조합하여 더 큰 기능을 구현할 수 있습니다. 이는 코드의 모듈성을 강화하며 유지보수와 확장성을 높입니다. 특정한 기능을 수행하는 함수형 인터페이스를 다양한 곳에서 활용할 수 있어 코드의 재사용성을 높이는 데 기여합니다.
아래의 코드와 같이 중복을 피하고 코드의 재사용성을 높일 수 있습니다. 동시에 계산기 각각의 기능등을 함수로 표현하면서 모듈성이 강화되고 이를 통해 필요한 함수를 조합하여 사용이 가능합니다.

@FunctionalInterface
interface Calculator {
    double calculate(double x, double y);
}
class MathOperations {
    static double multiply(double x, double y) {
        return x * y;
    }
    static double subtract(double x, double y) {
        return x - y;
    }
}
public class CalculatorExample {
    public static void main(String[] args) {
        Calculator multiplication = MathOperations::multiply;
        Calculator subtract = MathOperations::subtract;
    }
}

4. 테스트 용이성과 예측 가능한 코드
함수형 프로그래밍에서는 순수 함수가 중요한 역할을 합니다. 순수 함수는 입력 값에 의해서만 결과가 결정되고 외부 상태에 영향을 주지 않습니다. 이로써 테스트가 용이하며 예측 가능한 동작을 보장할 수 있습니다. 따라서 버그를 줄이고 안정적인 코드를 작성할 수 있습니다.
이렇게 순수 함수를 활용하면 테스트가 매우 쉬워집니다.
다양한 입력값에 대한 결과를 예상하고 비교하기 용이합니다
또한 이러한 함수들은 격리된 상태에서 테스트할 수 있어
외부 환경의 영향을 받지 않고 테스트가 가능합니다.

public class PredictableCodeExample {
    public static void main(String[] args) {
        // 예측 가능한 코드: 순수 함수 사용
        Function<Integer, Integer> addFive = num -> num + 5;
        Function<Integer, Integer> multiplyByTwo = num -> num * 2;

        int input = 10;

        int resultAfterAddition = addFive.apply(input);
        int resultAfterMultiplication = multiplyByTwo.apply(resultAfterAddition);

        System.out.println("Input: " + input);
        System.out.println("Result after addition: " + resultAfterAddition);
        System.out.println("Final result after multiplication: " + resultAfterMultiplication);
    }
}



5. 유연성과 확장성
함수형 인터페이스를 사용하면 함수를 매개변수로 전달하거나 반환할 수 있습니다. 이는 코드의 유연성을 높이고 재사용 가능한 코드를 작성하는 데 도움을 줍니다. 함수형 인터페이스를 조합하고 활용함으로써 다양한 시나리오에 대응하는 유연한 코드를 작성할 수 있습니다.
아래코드의 주목할점은 Function을 매개변수로 받아서 연산을 수행할 수있습니다 이렇게 사용함으로써 코드를 유연하고 확장 가능하게 만들 수 있습니다

public class FlexibilityAndScalabilityExample {
    public static void main(String[] args) {
        // 유연성과 확장성: 함수를 매개변수로 전달하여 다양한 연산 수행
        Function<Integer, Integer> operation = num -> num * 3;

        int input = 7;
        int result = performOperation(input, operation);

        System.out.println("Input: " + input);
        System.out.println("Result after operation: " + result);
    }

    // 함수를 매개변수로 받아 연산을 수행하는 메서드
    static int performOperation(int num, Function<Integer, Integer> operation) {
        return operation.apply(num);
    }
}

마무리
자바에서 함수형 인터페이스의 활용은 람다 표현식을 통해 코드를 간결하고 유연하게 작성하는데 큰 도움을 줍니다. 이를 통해 코드의 가독성과 유지보수성을 향상시키며, 병렬 프로그래밍을 더욱 용이하게 만들 수 있습니다. 함수형 인터페이스의 다양한 장점을 활용하여 더 나은 코드를 작성해보세요!

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] Stream API의 함수 1  (0) 2023.08.18
[JAVA] jdk8부터 지원하는 함수형 인터페이스  (0) 2023.08.08
[자바] Call By Value의 함정  (0) 2023.08.08
open JDK 설치  (0) 2022.09.16
자바 확인하는 방법  (0) 2022.08.30