Java - CompletableFuture API 개선 사항

안녕하세요, 미래의 자바 개발자 여러분! 자바의 CompletableFuture API 개선 사항을 탐구하는 흥미로운 여정에 함께 뛰어들게 되어 기쁩니다. 프로그래밍에 새로운 사람이라면 걱정 마세요; 기초부터 시작하여 차근차근 진행하겠습니다. 이 튜토리얼이 끝나면 여러분이 배운 것을 놀라게 될 것입니다!

Java - CompletableFuture API Improvements

CompletableFuture는 무엇인가요?

개선 사항에 들어가기 전에 먼저 CompletableFuture가 무엇인지 이해해 보겠습니다. 복잡한 식사를 요리하는 것을 생각해 보세요. 파스타가 끓기다가 채소를 썰지 않을 거예요, 아닙니까? CompletableFuture는 여러 명의 셰프가 각기 다른 작업을 동시에 수행하는 것과 같습니다. 이는 자바의 비동기 프로그래밍을 처리하는 방법으로, 코드가 여러 가지 작업을 동시에 수행할 수 있도록 허용합니다.

기본 CompletableFuture 예제

간단한 예제로 시작해 보겠습니다:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, Future!";
});

System.out.println(future.get());

이 코드에서는 CompletableFuture를 만들어 문자열을 반환합니다. supplyAsync 메서드는 코드를 별도의 쓰레드에서 실행합니다. 쓰레드가 1초 동안.sleep을 하여 작업을 시仿하고 있습니다. 그런 다음, 인사말을 반환합니다. get() 메서드는 Future가 완료되기를 기다렸다가 결과를 반환합니다.

지연 및 타임아웃 지원 개선

CompletableFuture API의 흥미로운 개선 사항 중 하나는 지연 및 타임아웃 지원의 개선입니다. 이는 부엌에서 타이머를 설정하는 것과 같습니다 - 소스가 영원히 끓지 않도록 하려고 합니다!

지연 예제

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + ", World!")
.completeOnTimeout("Timeout occurred", 2, TimeUnit.SECONDS)
.orTimeout(3, TimeUnit.SECONDS);

System.out.println(future.get());

이 예제에서는 "Hello"를 반환하는 Future를 만듭니다, 그런 다음 "Hello, World!"로 수정합니다. 두 가지 새로운 메서드를 사용하고 있습니다:

  1. completeOnTimeout: Future가 2초 내에 완료되지 않으면 기본 값으로 완료합니다.
  2. orTimeout: Future가 3초 내에 완료되지 않으면 예외를 발생시킵니다.

이렇게 하면 코드가 무한히 걸리지 않도록 보장할 수 있습니다.

서브 클래스화 개선

CompletableFuture 클래스는 이제 확장하기 더 쉬워졌으며, 사용자 정의 버전을 만들 수 있습니다. 이는 여러분이 필요한 것을 정확히 수행하는 커스텀 부엌 기기를 만드는 것과 같습니다!

서브 클래스화 예제

public class MyFuture<T> extends CompletableFuture<T> {
@Override
public <U> MyFuture<U> thenApply(Function<? super T, ? extends U> fn) {
return (MyFuture<U>) super.thenApply(fn);
}

// 다른 재정의된 메서드들...
}

MyFuture<String> myFuture = new MyFuture<>();
myFuture.complete("Hello, Custom Future!");
System.out.println(myFuture.get());

이 예제에서는 MyFuture 클래스를 만들어 CompletableFuture를 확장합니다. thenApply 메서드를 재정의하여 커스텀 Future 타입을 반환합니다. 이렇게 하면 연속적인 연산을 유지하면서 커스텀 타입을 유지할 수 있습니다.

새로운 팩토리 메서드

자바는 CompletableFuture를 더 쉽게 만들기 위해 새로운 팩토리 메서드를 도입했습니다. 이는 책에서 미리 설정된 레시피와 같습니다!

팩토리 메서드 표

메서드 설명
failedFuture(Throwable ex) 이미 예외로 완료된 CompletableFuture를 생성합니다
completedStage(T value) 주어진 값을으로 이미 완료된 CompletionStage를 생성합니다
failedStage(Throwable ex) 이미 예외로 완료된 CompletionStage를 생성합니다

팩토리 메서드 예제

CompletableFuture<String> successFuture = CompletableFuture.completedFuture("Success!");
CompletableFuture<String> failedFuture = CompletableFuture.failedFuture(new Exception("Oops!"));

try {
System.out.println(successFuture.get());
System.out.println(failedFuture.get());
} catch (Exception e) {
System.out.println("에러가 발생했습니다: " + e.getMessage());
}

이 예제에서는 completedFuture 메서드를 사용하여 성공한 Future를 생성하고, failedFuture 메서드를 사용하여 실패한 Future를 생성합니다. 이는 테스트나 동기 및 비동기 코드 통합에 유용할 수 있습니다.

결론

와우! 오늘 많은 내용을 다루었습니다. CompletableFuture의 기본 개념에서부터 새로운 개선 사항까지, 자바의 비동기 프로그래밍 세계로의 첫 걸음을 내셨습니다. 요리를 배우는 것처럼, 이 개념을 마스터하려면 연습이 필요합니다. 실험하고 실수를 두려워하지 마세요 - 이게 우리가 배우는 방법입니다!

제가 가르치는 연간 동안, 두려워하지 않고 코드에 손을 대는 학생들이 가장 뛰어나게 성과를 내는 것을 발견했습니다. 따라서 이 예제들을 수정하고, 깨끗이 하고, 어떤 일이 일어나는지 보세요. 이렇게 하면 그들이 어떻게 작동하는지 정말로 이해할 수 있습니다.

미래의 자바 마스터 여러분, 즐겁게 코딩하세요!

Credits: Image by storyset