이 글에서는 자바(Java)에서 람다식(lambda expression)을 메서드 인수로 전달하는 방법을 알아봅니다. 람다식은 매개변수를 받아 결과값을 반환하는 짧은 코드 블록으로, 익명 함수처럼 동작하기 때문에 별도의 클래스나 메서드 선언 없이 간결하게 기능을 표현할 수 있습니다.
특히 컬렉션 프레임워크의 forEach() 메서드는 람다식을 인수로 받는 대표적인 예입니다. 아래에서 실제 동작 과정을 단계별로 살펴보겠습니다.
문제 정의
람다식을 메서드 인수로 전달하여 리스트에 저장된 각 문자열을 거꾸로 뒤집어 출력하는 프로그램을 작성해 보겠습니다.
입력
입력으로 다음과 같은 문자열 리스트가 주어진다고 가정합니다.
("Apple", "Orange", "Grapes")출력
원하는 출력 결과는 다음과 같습니다.
elppA, egnarO, separG
알고리즘
- 프로그램을 시작합니다.
- 필요한 패키지(
java.util.ArrayList,java.util.Arrays)를 임포트합니다. main메서드 안에서 문자열 데이터를 담은ArrayList를 정의합니다.- 정의된
ArrayList를 콘솔에 출력합니다. forEach()메서드에 람다식을 인수로 전달하여 리스트의 각 요소를 순회합니다.- 람다식 내부에서 각 문자열의 마지막 문자부터 첫 번째 문자까지 역순으로 접근하여 새로운 문자열을 만듭니다.
- 뒤집힌 문자열들을 콤마로 구분해 출력하면, 모든 요소가 반대 순서로 표시됩니다.
예제 1
아래 예제에서는 과일 이름으로 구성된 리스트가 미리 정의되어 있으며, 람다식을 통해 각 문자열이 뒤집혀 콘솔에 출력됩니다.
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
ArrayList<String> Fruits = new ArrayList<>(Arrays.asList("Apple", "Orange", "Grapes"));
System.out.println("The ArrayList is defined as : " + Fruits);
System.out.print("The Reversed ArrayList is: ");
Fruits.forEach((e) -> {
String result = "";
for (int i = e.length()-1; i >= 0 ; i--)
result += e.charAt(i);
System.out.print(result + ", ");
});
}
}
실행 결과
The ArrayList is defined as : [Apple, Orange, Grapes]
The Reversed ArrayList is: elppA, egnarO, separG,
예제 2
이번에는 스포츠 종목 이름으로 구성된 리스트를 사용하여 같은 방식을 적용해 보겠습니다. 람다식 하나만으로 여러 종류의 리스트에 동일한 로직을 재사용할 수 있다는 점을 확인할 수 있습니다.
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
ArrayList<String> Games = new ArrayList<>(Arrays.asList("Football", "Cricket", "Baseball"));
System.out.println("The ArrayList is defined as : " + Games);
System.out.print("The Reversed ArrayList is: ");
Games.forEach((e) -> {
String result = "";
for (int i = e.length()-1; i >= 0 ; i--)
result += e.charAt(i);
System.out.print(result + ", ");
});
}
}
실행 결과
The ArrayList is defined as : [Football, Cricket, Baseball]
The Reversed ArrayList is: llabtooF, tekcirC, llabesaB,
핵심 정리
위 예제에서 사용된 람다식 (e) -> { ... }은 forEach() 메서드가 요구하는 Consumer 함수형 인터페이스의 구현체로 전달됩니다. 이처럼 람다식을 메서드 인수로 직접 전달하면 다음과 같은 장점이 있습니다.
- 익명 내부 클래스를 작성할 필요 없이 코드가 훨씬 간결해집니다.
- 반복 로직과 처리 로직을 한 곳에서 명확하게 표현할 수 있습니다.
- 동일한 람다식 패턴을 다양한 컬렉션에 손쉽게 재사용할 수 있습니다.