Java 8에서 도입된 Lambda Expressions와 Functional Interface는 코드를 간결하게 작성하고, 함수형 프로그래밍 스타일을 Java에 도입하는 데 중요한 역할을 했습니다. 이 블로그에서는 Lambda Expressions와 Functional Interface의 개념, 사용법, 그리고 주요 활용법에 대해 알아 보겠습니다.
1. Lambda Expressions란?
Lambda Expressions는 익명 함수(Anonymous Function)를 작성할 수 있는 간결한 방법입니다. 메서드를 하나의 식(expression)으로 표현할 수 있어, 코드의 가독성과 유지보수성을 크게 향상시킵니다.
문법 형식
(parameters) -> { body }
예제
(int a, int b) -> { return a + b; } // 매개변수와 본문 포함
x -> x * x // 매개변수가 하나일 때 괄호 생략 가능
() -> System.out.println("Hello, Lambda!") // 매개변수가 없는 경우
2. Functional Interface란?
Functional Interface는 단 하나의 추상 메서드만 가지는 인터페이스입니다. Lambda Expressions는 Functional Interface를 구현하는 데 사용됩니다.
대표적인 Functional Interface:
- Runnable:
run()
메서드 포함 합니다. - Callable:
call()
메서드 포함 합니다. - Comparator:
compare()
메서드 포함 합니다. - Custom Functional Interface: 사용자 정의 가능 합니다.
예
@FunctionalInterface
public interface MyFunctionalInterface {
void execute();
}
3. Lambda Expressions와 Functional Interface 사용법
- 기본 사용법
@FunctionalInterface interface Calculator { int operate(int a, int b); } public class LambdaExample { public static void main(String[] args) { // Lambda Expression으로 구현 Calculator add = (a, b) -> a + b; Calculator multiply = (a, b) -> a * b; System.out.println("Addition: " + add.operate(5, 3)); System.out.println("Multiplication: " + multiply.operate(5, 3)); } }
출력
Addition: 8 Multiplication: 15
- Java 제공 Functional Interface 활용: Java 8은
java.util.function
패키지에 다양한 Functional Interface를 제공합니다.- Predicate: 조건 검사를 위한 인터페이스 입니다.
Predicate<Integer> isEven = x -> x % 2 == 0; System.out.println(isEven.test(4)); // true
- Consumer: 값을 소비(처리)하는 인터페이스 입니다.
Consumer<String> print = s -> System.out.println(s); print.accept("Hello, Consumer!");
- Function: 입력을 받아 변환 후 반환하는 인터페이스 입니다.
Function<String, Integer> length = s -> s.length(); System.out.println(length.apply("Lambda")); // 6
- Supplier: 값을 반환하는 인터페이스 입니다.
Supplier<Double> randomValue = () -> Math.random(); System.out.println(randomValue.get());
- Predicate: 조건 검사를 위한 인터페이스 입니다.
- 컬렉션과의 통합: Lambda Expressions는 컬렉션 처리에 매우 유용합니다.예제
import java.util.*; public class CollectionExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // forEach와 Lambda 사용 names.forEach(name -> System.out.println(name)); // Stream API와 함께 사용 names.stream() .filter(name -> name.startsWith("A")) .forEach(System.out::println); } }
출력
Alice Bob Charlie Alice
4. Lambda Expressions와 Functional Interface의 장점
- 간결한 코드 작성
- 익명 클래스를 작성할 필요가 없어 코드가 짧아지고, 가독성이 향상됩니다.
- 고차 함수 지원
- 함수를 다른 함수의 인수로 전달하거나 반환값으로 사용할 수 있습니다.
- 병렬 처리 용이
- Stream API와 결합하여 병렬 처리를 간단하게 구현할 수 있습니다.
- 유연한 설계
- 코드의 재사용성과 유지보수성이 높아집니다.
5. Lambda Expressions와 Functional Interface 활용 사례
- 이벤트 처리
button.addActionListener(e -> System.out.println("Button clicked!"));
- 스레드 작업
new Thread(() -> System.out.println("Thread running")).start();
- 데이터 변환
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<Integer> nameLengths = names.stream() .map(name -> name.length()) .toList(); System.out.println(nameLengths); // [5, 3, 7]
- 조건부 필터링
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .filter(n -> n % 2 == 0) .forEach(System.out::println); // 2, 4
결론
Lambda Expressions와 Functional Interface는 Java 프로그래밍에서 생산성과 가독성을 높이는 데 중요한 역할을 합니다. Java의 함수형 프로그래밍 기능을 적극 활용하여 코드를 더 간결하고 효율적으로 작성해 보시길 바랍니다. 특히, Stream API와 결합하여 대규모 데이터 처리와 병렬 프로그래밍을 손쉽게 구현할 수 있습니다.
다음 블로그에서는 Java에서의 String 처리에서 성능 최적화와 효율적인 사용 방법에 대해 알아 보겠습니다. 감사합니다.