Java

자바 람다 표현식 (lambda expression)

ch-yang 2023. 1. 1. 21:28

자바의 람다 표현식은 메서드를 하나의 식(expression)으로 표현한 것입니다.
람다 표현식은 익명의 클래스를 구현하고 동시에 객체를 생성합니다.

익명의 메서드로 보일 수도 있지만, 람다 표현식은 익명의 메서드가 아닌 익명의 클래스를 생성합니다.
이에 대한 내용은 다음 예제들과 함께 설명하겠습니다.

@FunctionalInterface
public interface MyInterface {
    String doSomething(String s);
}

람다식을 사용하기 위해서는 먼저 구현하고자 하는 함수형 인터페이스가 있어야 합니다.
함수형 인터페이스란 1개의 추상 메서드만 갖고 있는 인터페이스를 뜻합니다.
그리고 이를 강제하기 위해 @FunctionalInterface 같은 어노테이션도 사용할 수 있습니다.

람다 표현식은 함수형 인터페이스를 구현하고 동시에 객체를 생성한다고 했는데
위 예제의 인터페이스를 보면 메서드명은 doSomething으로 이미 정해져 있는 것을 확인할 수 있습니다.

이 함수형 인터페이스를 세 가지 방법으로 구현해보겠습니다.

  1. MyInterface 구현 하는 기명의 구현 클래스 (MyInterfaceImpl)를 작성하고 객체를 생성 후 인자로 전달
  2. 익명의 구현 클래스로 객체로 생성 후 인자로 전달 (1회성)
  3. 람다 표현식 (1회성)
class MyInterfaceImpl implements MyInterface {
    @Override
    public String doSomething(String s) {
        return s + "-Ex_1";
    }
}

public class Main {

    public static void testMethod(MyInterface my) {
        System.out.println(my.doSomething("testMethod"));
    }

    public static void main(String[] args) {

        // Example 1
        testMethod(new MyInterfaceImpl());

        // Example 2
        testMethod(new MyInterface() {
            @Override
            public String doSomething(String s) {
                return s + "-Ex_2";
            }
        });

        // Example 3
        testMethod((String s) -> { return s + "-Ex_3"; });
    }
}
// 출력
testMethod-Ex_1
testMethod-Ex_2
testMethod-Ex_3

위의 예제에서 testMethod 메서드는 MyInterface 객체를 인자로 받고 객체의 doSomething() 메서드가 반환하는 String을 출력합니다.

Example 1, 2 방법이 클래스를 구현하고 객체를 생성한 것처럼
Example 3의 람다 표현식 또한 클래스를 구현하고 객체를 생성한 것을 확인할 수 있습니다.