Home > Backend > Java > ☕️[Java] 람다식

☕️[Java] 람다식
Java Programming Language Backend

1️⃣ 람다식.

1. 람다 표현식(Lambda Expression)

자바 프로그래밍에서 람다식 또는 람다 표현식(Lambda Expression)은 간결한 방식으로 익명 함수(anonymous function)를 제공하는 기능입니다.

자바 8부터 도입된 이 기능은 함수형 프로그래밍의 일부 개념을 자바에 도입하여, 코드를 더 간결하고 명료하게 만들어 주며 특히 컬렉션의 요소를 처리할 때 유용하게 사용됩니다.

1.2 람다식의 특징.

  • 익명성 : 람다는 이름이 없기 때문에 익명으로 처리됩니다.
  • 함수 : 람다는 메서드와 유사하지만, 독립적으로 존재할 수 있는 함수입니다.
  • 전달성 : 람다 표현식은 메서드 인자로 전달되거나 변수에 저장될 수 있습니다.
  • 간결성 : 코드의 간결성을 높여, 불필요한 반복을 줄여줍니다.

1.3 람다 표현식의 기본 구조.

람타 표현식은 주로 매개 변수를 받아들여 결과를 반환하는 식의 형태로 작성됩니다.

일반적인 형태는 다음과 같습니다.

(parameters) -> expression
또는
(parameters) -> { statements; }
  • 매개 변수 : 괄호 안에 정의되며, 매개 변수의 타입을 명시할 수도 있고 생략할 수도 있습니다.
    • 매개 변수가 하나뿐인 경우, 괄호도 생략할 수 있습니다.
  • 화살표(->) : 매개 변수와 몸체를 구분짓는 역할을 합니다.

  • 몸체 : 람다의 실행 로직을 담고 있으며, 식(expression) 또는 문장(statements)이 올 수 있습니다.
    • 식은 단일 실행 결과를 반환하며, 중괄호는 생략할 수 있습니다.
    • 문장은 중괄호 안에 작성되며, 여러 줄의 코드를 포함할 수 있습니다.

1.4 예시

  1. Thread 실행하기
    new Thread(() -> System.out.println("Hello from a thread")).start();
    
  2. 리스트의 각 요소 출력하기
    List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
    list.forEach(item -> System.out.println(item));
    
  3. Comparator를 통한 정렬
    List<String> cities = Arrays.asList("Seoul", "New York", "London");
    Collections.sort(cities, (s1, s2) -> s1.compareTo(s2));
    

1.5 📝 정리.

람다 표현식은 이벤트 리스너, 스레드의 실행 코드 등 여러 곳에서 기존에 익명 클래스를 사용하던 부분을 대체하여 코드를 더 간결하게 만들 수 있습니다.

또한, 스트림 API와 함께 사용될 때 강력한 데이터 처리 기능을 제공하여 복잡한 컬렉션 처리를 단순화시킬 수 있습니다.


2. 람다식의 장점.

자바에서 람다식(Lambda Expression)을 사용하는 것은 여러 가지 장점을 제공합니다.

이러한 장점들은 프로그래밍 스타일, 코드의 간결성, 효율성 및 기능성 측면에서 특히 두드러집니다.

2.1 람다식의 주요 장점들.

  • 1. 코드의 간결성 : 람다식을 사용하면 복잡한 익명 클래스를 사용할 필요가 없어지므로 코드를 훨씬 간결하게 작성할 수 있습니다.
    • 예를 들어, 스레드를 실행하거나 이벤트 리스너를 설정할 때 몇 줄의 코드로 작성할 수 있습니다.
  • 2. 가독성 향상 : 람다식은 기존의 익명 클래스보다 훨씬 읽기 쉽고 이해하기 쉬운 코드를 작성할 수 있게 합니다.
    • 이는 유지보수 시간을 줄이고 코드의 질을 향상시키는 데 도움이 됩니다.
  • 3. 함수형 프로그래밍 지원 : 람다식은 자바에 함수형 프로그래밍 스타일을 도입하였습니다.
    • 이는 데이터 처리와 조작을 보다 선언적으로 표현할 수 있게 해, 복잡한 데이터 처리 로직을 간결하고 효율적으로 작성할 수 있도록 합니다.
  • 4. 코드의 재사용성 증가 : 람다식을 사용하면 특정 동작을 수행하는 코드 블록을 쉽게 재사용할 수 있습니다.
    • 람다식은 변수처럼 취급될 수 있어, 메소드에 인자로 전달하거나 변수에 할당하여 다른 위치에서 사용할 수 있습니다.
  • 5. 병렬 실행 용이 : 자바 8 이후로 스트림 API와 결합된 람다식은 컬렉션 처리를 병렬로 쉽게 수행할 수 있게 해줍니다.
    • 이는 ‘parallelStream()’ 과 같은 메소드를 사용하여 멀티코어 프로세서의 이점을 쉽게 활용할 수 있게 합니다.
  • 6. 지연 실행(Lazy Evaluation) : 람다식은 지연 실행을 가능하게 합니다.
    • 예를 들어, 조건이 충족될 때까지 코드 실행을 지연시키거나, 필요할 때만 데이터를 처리하도록 할 수 있습니다.
      • 이는 성능 최적화에 도움을 줄 수 있습니다.
  • 7. 함수 인터페이스와의 호환성 : 람다식은 단일 추상 메소드를 가진 인터페이스(함수 인터페이스)와 호환됩니다.
    • 이는 많은 내장 함수 인터페이스(‘Runnable’, ‘Callable’, ‘Comparator’ 등)와 사용자 정의 함수 인터페이스에 람다식을 적용할 수 있음을 의미합니다.

2.2 📝 정리.

이러한 장점들로 인해 람다식은 자바 프로그래머들 사이에서 매우 인기 있는 기능이 되었으며, 모던 자바 코드에서는 필수적인 요소로 자리 잡고 있습니다.


3. 람다식의 단점.

자바에서 람다식을 사용하면 여러 가지 장점이 있지만, 몇 가지 단점 또는 주의할 점도 있습니다.

3.1 람다식의 사용과 관련된 단점.

  • 1. 디버깅의 어려움 : 람다식은 익명 함수이기 때문에 디버깅이 더 복잡할 수 있습니다.
    • 스택 트레이스에서 람다식이 어디에 위치하는지 명확하게 표시되지 않아 오류를 추적하기 어려울 수 있습니다.
  • 2. 코드의 남용 : 람다식을 과도하게 사용하면 코드가 오히려 더 복잡해지고 이해하기 어려워질 수 있습니다.
    • 특히 람다 내부에 긴 로직이나 조건문을 넣을 경우 가독성이 떨어질 수 있습니다.
  • 3. 람다 캡처링 오버헤드 : 람다식은 주변 환경의 변수를 캡처(Capture)할 수 있습니다.
    • 이 때, 람다가 외부 변수를 캡처 할 경우 추가적인 비용이 발생할 수 있으며, 이는 성능에 영향을 줄 수 있습니다.
  • 4. 직렬화의 문제 : 람다식은 기본적으로 직렬화가 보장되지 않습니다.
    • 따라서 람다식을 사용하는 객체를 직렬화하려고 할 때 문제가 발생할 수 있습니다.
      • 이는 분산 시스템에서 특히 중요한 이슈가 될 수 있습니다.
  • 5. 학습 곡선 : 자바 8 이전의 버전에 익숙한 개발자들에게 람다식과 스트림 API는 새로운 패러다임을 익혀야 하는 도전과제를 제시합니다.
    • 이는 초기 학습 곡선을 가파르게 만들 수 있습니다.
  • 6. 타입 추론의 복잡성 : 람다식에서는 자바 컴파일러가 타입을 추론해야 하는데, 때때로 이 추론이 개발자의 의도와 다른게 이루어질 수 있습니다.
    • 이는 코드의 명확성을 떨어뜨릴 수 있습니다.
  • 7. 함수형 인터페이스의 제약 : 람다식은 단 하나의 추상 메소드를 가진 함수형 인터페이스와 함꼐 사용됩니다.
    • 때로는 이런 제약이 프로그램 설계를 더 복잡하게 만들 수 있습니다.

3.2 📝 정리.

람다식의 단점들은 주로 개발과 관련된 트레이드오프와 관련이 있으며, 이러한 단점을 이해하고 적절히 관리한다면 람다식을 효과적으로 사용할 수 있습니다.