java의 람다 표현

() => x // () => {return x; }

(매개변수) => 반환 타입

() => 반환타입 // 매개변수 없을 경우

 

비동기 프로그래밍을 설명할 때 자바의 함수형 표현(람다식, 함수형 인터페이스 등)을 쓰는 이유가 뭘까


 

1. 비동기 코드에서 콜백을 간결하게 표현할 수 있음

비동기 코드는 보통 콜백(callback) 형태로 동작하는데, 전통적인 방식으로 콜백을 작성하면 코드가 길고 복잡해질 수 있다.
자바의 람다식을 사용하면 비동기 작업을 간결하게 표현할 수 있어서 함수형 표현이 많이 쓰인다.

예제 1: 전통적인 방식 (익명 클래스)

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("비동기 작업 수행 중...");
    }
}).start();

✅ Runnable을 구현한 익명 클래스를 생성해야 해서 코드가 길어짐.

예제 2: 함수형 표현 (람다식)

new Thread(() -> System.out.println("비동기 작업 수행 중...")).start();

람다식을 사용하면 코드가 훨씬 간결해짐!


2. 비동기 스트림(리액티브 프로그래밍)과 잘 어울림

자바에서 비동기 작업을 처리하는 대표적인 라이브러리로 CompletableFuture(JDK 기본 제공)와 Project Reactor(Spring WebFlux에서 사용)가 있다.
이들은 함수형 프로그래밍 스타일을 기반으로 동작하기 때문에, 함수형 표현이 자연스럽게 따라온다.

예제 3: CompletableFuture (비동기 작업)

CompletableFuture.supplyAsync(() -> "데이터 가져오기")
                 .thenApply(result -> result + " 완료")
                 .thenAccept(System.out::println);

✅ supplyAsync() → 비동기 작업 실행
✅ thenApply() → 결과를 변환
✅ thenAccept() → 최종 결과 출력


3. 함수형 스타일은 선언적이어서 가독성이 좋음

전통적인 명령형 코드(imperative)는 어떻게 실행할지를 직접 명시해야 하지만, 함수형 스타일은 무엇을 실행할지 선언적으로 표현할 수 있다.
비동기 코드에서는 콜백 지옥(callback hell)을 피하고 가독성을 높이는 데 유리하다.

예제 4: Reactor (Spring WebFlux)

Mono.fromSupplier(() -> "데이터 가져오기")
    .map(data -> data + " 완료")
    .subscribe(System.out::println);

✅ 선언형 스타일이라 코드 흐름이 직관적임


4. 자바 8 이후부터 함수형 스타일이 권장됨

자바 8 이후부터 람다식, 스트림 API, 함수형 인터페이스가 추가되면서 함수형 스타일이 점점 더 권장되고 있다.
비동기 코드(멀티스레드, 리액티브 프로그래밍)는 함수형 스타일과 매우 잘 맞음.


 

즉, 비동기 작업을 더 쉽게 관리할 수 있음

비동기 작업은 여러 개의 작업을 동시에 처리해야 할 때 유용하다. 예를 들어, 외부에서 데이터를 받아오는 작업을 여러 개 동시에 할 때 사용한다.
이때, '결과가 언제 올지 모르는' 비동기 작업을 처리하는 방법이 람다식, 스트림(함수형 프로그래밍) 으로 더 간단해진다.

예시: 비동기 작업을 처리하는 코드

Mono.fromSupplier(() -> "데이터 가져오기")
	.map(data -> data + " 완료")
	.subscribe(System.out::println);

여기서 Mono는 비동기 작업을 관리하는 객체인데, '이 작업이 끝나면 이 작업을 해라' 하는 방식으로 코드를 쉽게 표현할 수 있다.
맵(map) 같은 함수형 메서드를 사용해서 데이터를 변환하고, 결과를 받아서 처리하는 구조다.