자바의 람다란? 간단한 사용법

GarionNachal·2025년 5월 6일
0

JAVA, Springboot

목록 보기
3/6
post-thumbnail

1. 람다식이란?

람다식(Lambda Expression)은 자바 8부터 도입된 기능으로, 함수형 프로그래밍을 구현하기 위한 핵심 요소입니다. 간단히 말하면, 메서드를 하나의 식(expression)으로 표현한 것입니다.

람다식의 가장 큰 특징은 익명 함수(Anonymous Function)라는 점입니다. 메서드의 이름이 없고, 메서드의 매개변수와 실행 코드만으로 구성됩니다. 이를 통해 코드가 간결해지고 가독성이 높아지는 장점이 있습니다.

2. 람다식의 기본 문법

람다식의 기본 문법은 다음과 같습니다:

Copy(매개변수) -> { 실행 코드 }

예를 들어, 두 수를 더하는 함수를 람다식으로 표현하면 다음과 같습니다:

Copy(int x, int y) -> { return x + y; }

이것을 더 간결하게 표현할 수도 있습니다:

Copy(x, y) -> x + y

위 예제에서 볼 수 있듯이, 람다식은 다음과 같은 요소들을 생략할 수 있습니다:

  • 매개변수 타입 (컴파일러가 추론 가능할 때)
  • 중괄호 { } (실행문이 한 줄일 때)
  • return 키워드 (실행문이 한 줄일 때)

3. 함수형 인터페이스

자바에서 람다식을 사용하기 위해서는 '함수형 인터페이스(Functional Interface)'가 필요합니다. 함수형 인터페이스란 단 하나의 추상 메서드만 가진 인터페이스를 말합니다.

자바에서는 @FunctionalInterface 어노테이션을 통해 함수형 인터페이스임을 명시할 수 있습니다.

Copy@FunctionalInterface
interface Calculator {
    int calculate(int x, int y);
}

이제 이 함수형 인터페이스를 이용하여 람다식을 변수에 할당할 수 있습니다.

CopyCalculator add = (x, y) -> x + y;
Calculator subtract = (x, y) -> x - y;
Calculator multiply = (x, y) -> x * y;
Calculator divide = (x, y) -> x / y;

System.out.println(add.calculate(10, 5));      // 출력: 15
System.out.println(subtract.calculate(10, 5)); // 출력: 5
System.out.println(multiply.calculate(10, 5)); // 출력: 50
System.out.println(divide.calculate(10, 5));   // 출력: 2

4. 자바 표준 함수형 인터페이스

자바에서는 자주 사용되는 함수형 인터페이스들을 java.util.function 패키지에 미리 정의해두었습니다. 대표적인 함수형 인터페이스는 다음과 같습니다:

1) Consumer

  • T 타입 인자를 받고 아무것도 반환하지 않는 함수
  • void accept(T t) 메서드 제공
CopyConsumer<String> printer = message -> System.out.println(message);
printer.accept("Hello, Lambda!"); // 출력: Hello, Lambda!

2) Supplier

  • 인자를 받지 않고 T 타입 결과를 제공하는 함수
  • T get() 메서드 제공
CopySupplier<String> messageSupplier = () -> "Hello, Lambda!";
System.out.println(messageSupplier.get()); // 출력: Hello, Lambda!

3) Function<T, R>

  • T 타입 인자를 받아서 R 타입 결과를 반환하는 함수
  • R apply(T t) 메서드 제공
CopyFunction<String, Integer> lengthFunction = str -> str.length();
System.out.println(lengthFunction.apply("Hello")); // 출력: 5

4) Predicate

  • T 타입 인자를 받아서 boolean 결과를 반환하는 함수
  • boolean test(T t) 메서드 제공
CopyPredicate<String> isEmpty = str -> str.isEmpty();
System.out.println(isEmpty.test("")); // 출력: true
System.out.println(isEmpty.test("Hello")); // 출력: false

5. 람다식 활용 예제

1) 스레드 생성

람다식을 사용하면 스레드 생성이 매우 간단해집니다.

Copy// 기존 방식
Thread thread1 = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("스레드 실행 중...");
    }
});

// 람다식 사용
Thread thread2 = new Thread(() -> {
    System.out.println("람다로 스레드 실행 중...");
});

thread1.start();
thread2.start();

2) 컬렉션 순회

CopyList<String> names = Arrays.asList("김철수", "이영희", "박지민", "최준서");

// 기존 방식
for (String name : names) {
    System.out.println(name);
}

// 람다식 사용
names.forEach(name -> System.out.println(name));

// 메서드 참조 사용 (더 간결)
names.forEach(System.out::println);

3) 컬렉션 필터링

CopyList<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// 짝수만 필터링
List<Integer> evenNumbers = numbers.stream()
                                   .filter(n -> n % 2 == 0)
                                   .collect(Collectors.toList());

System.out.println(evenNumbers); // 출력: [2, 4, 6, 8, 10]

6. 람다식의 장단점

장점

  1. 코드 간결성: 함수를 간결하게 표현할 수 있어 코드량이 줄어듭니다.
  2. 가독성 향상: 적절히 사용하면 코드의 의도가 더 명확해집니다.
  3. 함수형 프로그래밍: 자바에서 함수형 프로그래밍 패러다임을 적용할 수 있게 됩니다.
  4. 병렬 처리 용이: Stream API와 결합하여 병렬 처리를 쉽게 구현할 수 있습니다.

단점

  1. 디버깅 어려움: 람다식은 이름이 없어 디버깅 시 콜 스택 추적이 어렵습니다.
  2. 남용 시 가독성 저하: 복잡한 로직에 람다식을 남용하면 오히려 가독성이 떨어질 수 있습니다.
  3. 재귀 구현의 제약: 람다식으로 재귀 함수를 구현하기 어렵습니다.
  4. 성능 오버헤드: 특히 스트림과 함께 사용할 때 단순 for문보다 약간의 성능 오버헤드가 발생할 수 있습니다.

7. 결론

람다식은 자바 8에서 도입된 강력한 기능으로, 코드를 더 간결하고 표현력 있게 만들어 줍니다. 특히 함수형 프로그래밍 패러다임을 자바에 도입함으로써 더 유연하고 효율적인 코드 작성이 가능해졌습니다.

적절한 상황에서 람다식을 활용하면 코드의 품질과 가독성을 크게 향상시킬 수 있습니다. 하지만 모든 상황에서 람다식이 최선의 선택은 아니므로, 상황에 맞게 적절히 사용하는 것이 중요합니다.

람다식과 함수형 인터페이스를 잘 이해하고 활용한다면, 더 효율적이고 유지보수하기 쉬운 자바 코드를 작성할 수 있을 것입니다.

참고 자료

profile
AI를 꿈꾸는 BackEnd개발자

0개의 댓글