자기개발/검색한 자료 정리

Java 8의 함수형 인터페이스와 메소드 레퍼런스 사용법

실버블렛 2023. 4. 21. 01:43
반응형

Java 8의 함수형 인터페이스와 메소드 레퍼런스 사용법

Java 8에서는 함수형 프로그래밍 패러다임을 지원하기 위해 함수형 인터페이스와 메소드 레퍼런스를 도입했습니다. 이 글에서는 함수형 인터페이스와 메소드 레퍼런스를 이해하고 활용하는 방법에 대해 알아봅니다.

함수형 인터페이스

함수형 인터페이스는 오직 하나의 추상 메소드를 갖는 인터페이스입니다. 이를 통해 람다 표현식으로 간결하게 표현할 수 있습니다. 함수형 인터페이스는 @FunctionalInterface 어노테이션으로 표시할 수 있으며, 컴파일러가 이를 검사해줍니다.

예제:

@FunctionalInterface
public interface MyFunction {
    int apply(int a, int b);
}

기본 함수형 인터페이스

Java 8에서는 자주 사용되는 함수형 인터페이스를 제공합니다. 이들은 java.util.function 패키지에 포함되어 있습니다.

  1. Predicate: T 타입의 객체를 받아 boolean 값을 반환하는 test() 메소드를 가집니다.
  2. Consumer: T 타입의 객체를 받아 처리하는 accept() 메소드를 가집니다.
  3. Function<T, R>: T 타입의 객체를 받아 R 타입의 객체를 반환하는 apply() 메소드를 가집니다.
  4. Supplier: 객체를 받지 않고 T 타입의 객체를 반환하는 get() 메소드를 가집니다.

메소드 레퍼런스

메소드 레퍼런스는 람다 표현식을 더 간결하게 표현할 수 있는 방법입니다. 이를 사용하면 이미 정의된 메소드를 직접 참조하여 함수형 인터페이스의 구현을 대체할 수 있습니다. 메소드 레퍼런스는 다음과 같은 형태로 사용할 수 있습니다.

  1. 정적 메소드 레퍼런스: ClassName::methodName 형태로 사용합니다.
  2. 인스턴스 메소드 레퍼런스: instance::methodName 형태로 사용합니다.
  3. 생성자 레퍼런스: ClassName::new 형태로 사용합니다.


예제:

public class MethodReferenceExample {

    public static int multiply(int a, int b) {
        return a * b;
    }

    public static void main(String[] args) {
        // 정적 메소드 레퍼런스
        MyFunction multiplyFunction = MethodReferenceExample::multiply;

        int result = multiplyFunction.apply(3, 5);
        System.out.println("3 * 5 = " + result);

        // 인스턴스 메소드 레퍼런스
        MethodReferenceExample instance = new MethodReferenceExample();
        MyFunction instanceMultiplyFunction = instance::multiplyInstanceMethod;

        result = instanceMultiplyFunction.apply(4, 6);
        System.out.println("4 * 6 = " + result);

        // 생성자 레퍼런스
        MyFunctionConstructor constructorReference = MyClass::new;
        MyClass myClass = constructorReference.create(7);
        System.out.println("MyClass instance value: " + myClass.getValue());
    }

    public int multiplyInstanceMethod(int a, int b) {
        return a * b;
    }

    @FunctionalInterface
    interface MyFunctionConstructor {
        MyClass create(int value);
    }

    static class MyClass {
        private int value;

        public MyClass(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }
}  

이 예제에서는 정적 메소드 레퍼런스, 인스턴스 메소드 레퍼런스, 생성자 레퍼런스를 사용하여 각각의 메소드와 생성자를 참조하는 방법을 보여줍니다. 이를 통해 코드를 더 간결하게 표현하고 가독성을 높일 수 있습니다.

함수형 인터페이스와 메소드 레퍼런스를 이해하고 활용하면, Java에서 함수형 프로그래밍 패러다임을 효과적으로 사용할 수 있습니다. 이를 통해 코드의 간결성과 가독성을 높일 수 있으며, 개발자들의 생산성 향상에 도움이 됩니다.

반응형