IMCAT.DEV
로그인 가입
Java 중급 함수형

Java 람다 표현식

Java 람다 표현식 — 중급

람다 표현식

1. 도입 (왜 배워야 하는가)

자바의 람다 표현식은 자바 8에서 도입된 기능으로, 코드의 가독성과 간결성을 크게 향상시킵니다. 특히, 함수형 프로그래밍 패러다임을 활용하여 코드의 재사용성과 유지보수성을 높일 수 있습니다. 실무에서는 이벤트 처리, 콜백 함수, 스트림 API와 같은 다양한 곳에서 람다 표현식을 활용하게 됩니다.

람다 표현식을 모르면, 반복문이나 익명 내부 클래스를 사용하여 복잡한 코드를 작성해야 하며, 이로 인해 코드가 장황해지고 가독성이 떨어질 수 있습니다. 이런 문제는 특히 팀 프로젝트에서 코드의 이해도를 낮추고, 버그 발생 가능성을 높입니다.

2. 핵심 개념 설명

람다 표현식은 메소드를 간단하게 정의할 수 있는 방법입니다. 이를 통해 메소드를 구현하는 대신, 메소드의 매개변수로 전달할 수 있습니다.

비유하자면, 요리에서 레시피를 간단하게 메모해두고 요리를 할 때 그 레시피를 참고하는 것과 비슷합니다. 복잡한 요리를 매번 설명하기보다는, 요리법을 간단히 적어두고 필요할 때 참고하는 것이죠.

관련 용어 정리

용어설명
람다 표현식익명 함수의 일종으로, 함수형 인터페이스를 구현하는 방법
함수형 인터페이스단 하나의 추상 메소드를 가지는 인터페이스
스트림데이터의 흐름을 처리하는 추상화된 개념

3. 기본 코드 예제

아래는 가장 기본적인 람다 표현식을 사용하는 예제입니다.

import java.util.List;
import java.util.Arrays;

public class LambdaExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Jack");

        // 람다 표현식을 사용하여 이름을 출력
        names.forEach(name -> System.out.println(name));
    }
}

실행 결과

John
Jane
Jack

코드 한 줄씩 동작 설명

  1. import 문을 통해 필요한 클래스를 가져옵니다.
  2. main 메소드를 정의합니다. 프로그램의 시작점입니다.
  3. List<String> names를 생성하고, Arrays.asList로 초기화합니다.
  4. forEach 메소드를 사용하여 리스트의 각 요소에 대해 람다 표현식을 실행합니다.
  5. 람다 표현식 name -> System.out.println(name)은 각 이름을 출력하는 역할을 합니다.
  6. 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니 총합 계산

    쇼핑몰에서 장바구니에 담긴 상품의 가격 총합을 계산할 때 람다 표현식을 활용할 수 있습니다.

    import java.util.List;
    import java.util.Arrays;
    
    public class ShoppingCart {
        public static void main(String[] args) {
            List<Double> prices = Arrays.asList(29.99, 49.99, 19.99);
            
            double total = prices.stream()
                                 .mapToDouble(Double::doubleValue)
                                 .sum();
            
            System.out.println("총합: " + total);
        }
    }

    상황 설명: 이 코드는 고객의 장바구니에 담긴 상품 가격을 리스트로 받아, 스트림 API를 사용하여 총합을 계산합니다.

    예제 2: 필터링 기능

    사용자 목록에서 특정 조건을 만족하는 사용자만 필터링할 때 유용합니다.

    import java.util.List;
    import java.util.Arrays;
    import java.util.stream.Collectors;
    
    public class UserFiltering {
        public static void main(String[] args) {
            List<String> users = Arrays.asList("admin", "guest", "user1", "user2");
    
            List<String> filteredUsers = users.stream()
                                               .filter(user -> user.startsWith("user"))
                                               .collect(Collectors.toList());
    
            System.out.println("필터링된 사용자: " + filteredUsers);
        }
    }

    상황 설명: 이 코드는 사용자의 리스트에서 "user"로 시작하는 사용자만 필터링하여 새로운 리스트를 만듭니다.

    5. 흔한 실수와 주의사항

    실수 1: 람다 표현식에서 타입을 명시하지 않기

    람다 표현식은 매개변수의 타입을 생략할 수 있지만, 때로는 명시해 주는 것이 가독성에 도움이 됩니다.

    잘못된 코드

    names.forEach(name -> System.out.println(name)); // 타입이 명시되지 않음

    올바른 코드

    names.forEach((String name) -> System.out.println(name)); // 타입 명시

    실수 2: 함수형 인터페이스를 올바르게 사용하지 않기

    람다 표현식은 반드시 함수형 인터페이스에만 사용할 수 있습니다. 따라서 인터페이스가 단 하나의 추상 메소드를 가지고 있는지 확인해야 합니다.

    잘못된 코드

    // 두 개의 추상 메소드를 가진 인터페이스
    interface MyInterface {
        void method1();
        void method2();
    }
    
    // 람다 표현식 사용 시 오류 발생
    MyInterface obj = () -> System.out.println("Hello");

    올바른 코드

    // 하나의 추상 메소드를 가진 인터페이스
    interface MyFunctionalInterface {
        void method();
    }
    
    // 람다 표현식 사용
    MyFunctionalInterface obj = () -> System.out.println("Hello");

    6. 정리

    • 람다 표현식은 코드의 가독성과 간결성을 높여줍니다.
    • 함수형 인터페이스를 통해 메소드를 매개변수로 전달할 수 있습니다.
    • 스트림 API와 함께 사용하면 데이터 처리의 효율성을 극대화할 수 있습니다.
    • 다음에 학습하면 좋은 주제:

    • 스트림 API의 다양한 활용 방법
    • 함수형 프로그래밍의 기본 원칙
    • Optional 클래스와 Null 처리 방법