[Scala] Future와 동시성2

smlee·2023년 8월 22일
0

Scala

목록 보기
26/37
post-thumbnail

이 글은 Programming in Scala 4/e Chapter. 32를 읽고 작성한 글입니다.


Future 만들기

이전 게시물의 예제에서 사용한 apply 메서드 외에 Future 동반 객체이미 완료된 퓨처를 만들기 위해 successful, failed, fromTry라는 세 가지 팩토리 메서드를 제공한다. 이러한 팩토리 메서드들은 ExecutionContext가 필요하지 않다. 이미 완료된 퓨처이기 때문이다.

(1) successful


successful은 성공한 Future를 만드는 메서드이다. import문을 보면 알겠지만, 오직 scala.concurrent.Future만 임포트하고, ExecutionContext를 임포트하지 않았지만 잘 동작하는 것을 확인할 수 있다.

(2) failed


반면, failed 메서드는 이미 실패한 Future를 만든다.
이때 주의해야할 점은 반드시 Throwable이 와야 한다.

위의 코드처럼 멀쩡한 값이 오면 에러가 발생한다.

(3) fromTry

fromTry는 Try로부터 이미 완료된 Future를 만든다.

이전 포스트에서 Try를 공부하며 Try 하위에 Success와 Failure가 있는 것을 공부했다.

따라서, fromTry는 Try로부터 완료된 Future를 만드는 것이므로 scala.util 패키지에서 Failure나 Success를 import 시켜야 한다. 따라서 FailureSuccess를 만들 때는 fromTry를 사용해서 만든다.

(4) Promise

위의 방법도 많이 사용되긴 하지만, Future를 만드는 가장 일반적인 방법은 Promise를 사용하는 것이다. Promise가 있으면 그 Promise에 의해 제어되는 Future를 얻을 수 있다.
다음 예제를 보자

scala.concurrent.Promise를 import시켜 Promise를 사용한다.
pro에 Int형의 Promise를 선언하고, fut에는 pro에서 파생된 Future를 생성한다. 위와 같은 방식으로 Promise로부터 Future를 선언하면 Promise에 의해 fut은 제어된다. 그 예로 pro라는 프로미스에 success 메서드를 사용하여 값을 할당하면 fut 역시 할당이 완료된 것을 볼 수 있다.

filter, collect

Future는 filtercollect라는 메서드를 제공한다. 이들을 사용하면 퓨처값에 대해 성립하는 특성을 확인할 수 있다.

(1) filter

filter를 사용하면 Future의 결과를 검증할 수 있다. 검증 결과가 올바른 경우 그 값을 그대로 남겨두는 역할을 한다. Collection의 filter와 유사한 역할을 한다.

위와 같이 filter는 Future의 결과를 검증하며, 결과가 올바른 경우 남겨두고 올바르지 않은 경우 failure를 발생시킨다.
invalid.value를 실행하면 NoSuchElementException이 발생하며 실패한다.

(2) collect

collect 메서드를 사용하면 퓨처값을 검증하고 변환하는 작업을 수행할 수 있다.

collect는 양수인지 퓨처값을 검증하고 맞다면 다음 연산을 지목하는 작업이다. 만약 검증에 실패했다면 failure가 발생하고, NoSuchElementException역시 발생한다.

📚 Reference

  • Programming in Scala 4/e - Chapter.32

0개의 댓글