Java

[Java]람다식, 람다표현식(Lambda expression)

DevStory 2022. 5. 10.

람다식(Lambda expression)

Java 8에 도입된 람다식은 익명 함수로 메서드 이름이 존재하지 않으며 매개변수와 함수의 본문이 존재하는 메서드입니다.

 

화살표(->)는 매개변수와 메서드의 본문을 구분하기 위해 사용하는 람다 연산자입니다.


람다식 구문

람다식 구문은 다음과 같습니다.

(매개변수) -> 메서드 본문

왼쪽에 매개변수를 작성하며 오른쪽에 메서드 본문을 구현합니다. 메서드 본문이 짧은 경우 중괄호를 생략할 수 있으며 반대로 본문의 소스코드가 많은 경우 중괄호를 사용할 수 있습니다.

// 메서드 본문의 중괄호 생략
(x, y) -> x + y;

// 메서드 본문의 중괄호 추가
(x, y) -> {
  // 함수형 인터페이스의 추상 메서드 반환 타입이 void가 아닌 경우 return문 작성
  return x + y;
};

메서드 본문에 중괄호를 사용하고 함수형 인터페이스의 추상 메서드 반환 타입이 void가 아닌 경우 람다식 메서드 본문에 return문을 작성해야 합니다.

 

그리고 람다식은 함수형 인터페이스의 추상 메서드를 참조하므로 매개변수의 타입을 작성하지 않아도 됩니다.

 

예를 들어 다음과 같이 Integer 타입의 매개변수가 두 개 있으며, 매개변수의 합산을 Integer로 반환하는 메서드가 함수형 인터페이스에 존재합니다.

@FunctionalInterface
public interface FunctionInterface {
  Integer process(Integer x, Integer y);
}

이 함수형 인터페이스를 람다식으로 구현할 수 있으며, 클래스를 구현할 필요가 없습니다.

public class Main {
  public static void main(String args[]) {
    // 메서드 본문에 중괄호 존재
    FunctionInterface lambdaExistsBracket = (x, y) -> {
        return x + y;
    };

    // 메서드 본문에 중괄호 없음
    FunctionInterface lambdaNotExistsBracket = (x, y) -> x + y;

    // 호출 방법은 동일합니다.
    System.out.println(lambdaExistsBracket.process(10, 20));
    System.out.println(lambdaNotExistsBracket.process(50, 40));
  }
}

실행 결과

30
90

 

메서드 본문에 특정 로직을 구현해야 하는 경우 소스코드가 길어질 수 있습니다. 다음은 두 매개변수의 합이 0보다 크면 1을 반환하고 그렇지 않으면 -1을 반환하는 예제입니다.

public class Main {
  public static void main(String args[]) {
    FunctionInterface lambdaExistsBracket = (x, y) -> {
        if(x + y > 0) {
            return 1;
        } else {
            return -1;
        }
    };

    System.out.println(lambdaExistsBracket.process(10, 20));
    System.out.println(lambdaExistsBracket.process(10, -20));
  }
}

실행 결과

1
-1

람다식을 인수로 전달

람다식의 또 다른 용도는 인수로 전달하는 것입니다. 람다식을 매개변수로 전달하려면 메서드의 매개변수 타입이 함수형 인터페이스로 정의되어야 합니다.

 

다음은 Integer 타입의 두 매개변수와 Integer 타입의 값을 반환하는 추상 메서드가 존재하는 함수형 인터페이스입니다.

@FunctionalInterface
public interface FunctionInterface {
  Integer process(Integer x, Integer y);
}

람다식을 매개변수로 전달받기 위해 메서드의 매개변수 타입을 함수형 인터페이스로 정의합니다.

public static void printLambda(FunctionInterface lambda, Integer x, Integer y) {
  System.out.println(lambda.process(x, y));
}

다음 예제는 Main문에서 람다식을 정의 후 람다식을 printLambda()라는 메서드에 매개변수로 전달합니다.

@FunctionalInterface
public interface FunctionInterface {
  Integer process(Integer x, Integer y);
}

public class Main {
  public static void printLambda(
          FunctionInterface lambda, Integer x, Integer y) {
    System.out.println(lambda.process(x, y));
  }
    
  public static void main(String args[]) {
    FunctionInterface lambdaExistsBracket = (x, y) -> x + y;

    printLambda(lambdaExistsBracket, 10, 30);
  }
}

실행 결과

40

정리

  • 람다식은 익명 함수로 이름이 없는 메서드입니다.
  • 람다식은 함수형 인터페이스의 추상 메서드를 참조합니다.
  • 람다식을 인수로 전달할 수 있습니다.
반응형

댓글