1. 개념
- 자바에서 비동기 프로그래밍을 가능하게 하는 클래스.
- 기존 Future 라는 인터페이스를 Implements
📓 사용 이유
자바에서 비동기 프로그래밍을 사용해야 하는 상황에 해당 클래스를 사용한다.
그리고 Future라는 인터페이스가 있으나, 반드시 예외 처리를 해줘야 하는 부분이 있고,
get() 함수를 사용하거나, 타임아웃을 걸어주기 전까지는 다른 작업을 할 수 없다.
CompletableFuture의 경우는 다양한 상황의 비동기적 프로그래밍을 할 수 있고,
때에 따라서는 동기적 흐름을 만들 수 있다.
예를 들어, 메소드 A와 메소드 B의 관계에서, A와 B의 반환 값이 모두 필요한 상황이라면 A와 B를 동시에 실행하고, 두개의 메소드가 전부 완료되는 시점에 반환값들을 처리할 수 있다.
다른 상황으로는, A의 반환값이 B의 파라미터값으로 필요하다면, A가 완료되는 시점에 A의 반환값을 B로 전달하여 실행 가능하다.
다양한 상황에서 해당 클래스를 다양한 활용 방법으로 원하는 흐름을 만들 수 있다.
무엇보다 중요한 것은 위의 상황들이 끝날때까지 다른 작업을 못하는 것이 아니라는 점이다.
📓 예시
public static void testCase1() throws InterruptedException {
CompletableFuture future1 = CompletableFuture.runAsync(() -> {
try {
Thread.sleep(5000);
System.out.println("CompletableFuture!");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).exceptionally(throwable -> {
System.out.println(throwable.toString());
return null;
});
CompletableFuture future2 = CompletableFuture.runAsync(() -> {
try {
Thread.sleep(3000);
System.out.println("CompletableFuture!!!");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
System.out.println("Hello world!");
Thread.sleep(10000);
}
위의 코드를 실행하면 다음과 같은 결과가 콘솔에 출력된다.
Hello world!
CompletableFuture!!!
CompletableFuture!
순서 상으로는 거꾸로 출력되어야 하는데, 반대로 출력되고 있다.
Timer가 돌아가고 있지만, CompletableFuture를 활용했기 때문에, future1과 future2는 별도로 실행되고 있는 것이다.
CompletableFuture를 사용하지 않았을때를 비교해보자.
public static void testCase2() throws InterruptedException {
Thread.sleep(5000);
System.out.println("CompletableFuture!");
Thread.sleep(3000);
System.out.println("CompletableFuture!!!");
System.out.println("Hello world!");
}
위 코드를 실행하면 다음과 같은 결과가 콘솔에 출력된다.
CompletableFuture!
CompletableFuture!!!
Hello world!
순서대로 출력되는 것을 확인할 수 있다.
이처럼 CompletableFuture는 코드의 흐름을 원하는 방향으로 만들어낼 수가 있다.
'Language \ Framework > Java' 카테고리의 다른 글
| SOLID 원칙 (1) | 2025.04.21 |
|---|---|
| [JAVA] ReentrantLock, ReentrantReadWriteLock (0) | 2025.04.14 |