에스제이

반응형

 

람다식(Lambda Expression)은 Java 8부터 도입된 함수형 프로그래밍 기능으로, 코드의 간결성과 가독성을 높이기 위한 문법입니다. 람다식은 익명 함수를 생성하는 방식으로, 기존 익명 클래스를 대체하거나 간단한 기능을 효율적으로 구현하는 데 사용됩니다

 

1. 람다식의 기본 구조

람다식은 매개변수, 화살표(->), 그리고 실행될 코드 블록으로 구성됩니다.

(parameters) -> { expression or block of code }
(int x, int y) -> x + y  // 두 숫자의 합을 반환
() -> System.out.println("Hello, Lambda!")  // 인자가 없는 경우
(String s) -> s.toUpperCase()  // 문자열을 대문자로 변환

 

2. 람다식의 구성 요소

요소 설명
매개변수 메서드에 전달할 입력 값. 매개변수가 하나일 경우 괄호 생략 가능. 예: s -> s.length()
화살표(->) 매개변수와 실행될 코드를 구분.
코드 블록 실행할 코드 또는 반환 값을 정의. 단일 표현식일 경우 중괄호 생략 가능. 여러 줄일 경우 {} 사용.

 

3. 람다식의 사용법

람다식은 주로 **함수형 인터페이스(Functional Interface)**에서 사용됩니다. 함수형 인터페이스는 하나의 추상 메서드만 가지는 인터페이스입니다.

인터페이스 추상 메서드 설명 및 사용 예제
Runnable void run() 별도의 반환 값 없이 작업을 실행.
Consumer<T> void accept(T t) 입력만 받고 반환 값이 없는 연산을 수행.
Supplier<T> T get() 입력 없이 값을 반환.
Function<T, R> R apply(T t) 입력 값을 변환하여 다른 타입의 값을 반환.
Predicate<T> boolean test(T t) 입력 값에 대해 논리적인 테스트를 수행하고 결과를 반환.

3.1 Runnable 사용

Runnable r = () -> System.out.println("Lambda Runnable 실행!");
r.run();

 

3.2 Consumer 사용

Consumer<String> printer = s -> System.out.println(s);
printer.accept("람다식으로 출력!");

 

3.3 Function 사용

Function<Integer, String> converter = num -> "숫자: " + num;
System.out.println(converter.apply(10)); // 출력: 숫자: 10

 

4. 람다식과 컬렉션 API

람다식은 컬렉션과 스트림 API에서 매우 유용합니다.

4.1 forEach로 컬렉션 처리

List<String> names = Arrays.asList("Java", "Spring", "Hibernate");
names.forEach(name -> System.out.println(name));

4.2 스트림과 필터링

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
       .filter(n -> n % 2 == 0)  // 짝수만 필터링
       .forEach(System.out::println); // 출력: 2, 4

4.3 맵핑과 변환

List<String> names = Arrays.asList("java", "spring", "hibernate");
names.stream()
     .map(String::toUpperCase)  // 대문자로 변환
     .forEach(System.out::println);

 

5. 장점

코드 간결성: 익명 클래스와 비교하여 코드가 짧아지고 가독성이 향상됩니다.

지연 실행: 스트림 API와 함께 사용할 때 연산이 필요할 때까지 실행을 미룰 수 있습니다.

병렬 처리: 스트림 API와 함께 병렬 작업을 쉽게 구현할 수 있습니다.

 

6. 단점 및 주의사항

디버깅 어려움: 익명 클래스에 비해 오류 발생 시 디버깅이 어려울 수 있습니다.

복잡성 증가: 지나치게 복잡한 람다식을 사용하면 가독성이 오히려 떨어질 수 있습니다.

기능 제한: 함수형 인터페이스에 의존하기 때문에 다중 메서드를 포함한 로직 구현에는 부적합합니다.

 

7. 람다식과 메서드 참조

람다식의 단순화를 위해 메서드 참조를 사용할 수 있습니다.

7.1 정적 메서드 참조

Function<Integer, String> converter = String::valueOf;
System.out.println(converter.apply(42)); // 출력: "42"

7.2 인스턴스 메서드 참조

List<String> names = Arrays.asList("Java", "Spring", "Hibernate");
names.forEach(System.out::println);  // 메서드 참조로 출력

7.3 생성자 참조

Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();

 

8. 정리

람다식은 Java 프로그래밍에서 필수적으로 이해해야 할 중요한 개념입니다. 특히, 스트림 API와 함께 사용하면 더욱 강력한 기능을 발휘합니다. 이 글이 람다식의 이해와 실무 활용에 도움이 되기를 바랍니다

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band