이 글은 Programming in Scala 4/e
Chapter. 32를 읽고 작성한 글입니다.
이전 게시물의 예제에서 사용한 apply 메서드 외에 Future 동반 객체
는 이미 완료된 퓨처를 만들기 위해 successful
, failed
, fromTry
라는 세 가지 팩토리 메서드를 제공한다. 이러한 팩토리 메서드들은 ExecutionContext가 필요하지 않다.
이미 완료된 퓨처이기 때문이다.
successful
은 성공한 Future를 만드는 메서드이다. import문을 보면 알겠지만, 오직 scala.concurrent.Future
만 임포트하고, ExecutionContext를 임포트하지 않았지만 잘 동작하는 것을 확인할 수 있다.
반면, failed
메서드는 이미 실패한 Future를 만든다.
이때 주의해야할 점은 반드시 Throwable이 와야 한다.
위의 코드처럼 멀쩡한 값이 오면 에러가 발생한다.
fromTry는 Try로부터 이미 완료된 Future를 만든다.
이전 포스트에서 Try
를 공부하며 Try 하위에 Success와 Failure가 있는 것을 공부했다.
따라서, fromTry
는 Try로부터 완료된 Future를 만드는 것이므로 scala.util
패키지에서 Failure나 Success를 import 시켜야 한다. 따라서 Failure
나 Success
를 만들 때는 fromTry를 사용해서 만든다.
위의 방법도 많이 사용되긴 하지만, Future를 만드는 가장 일반적인 방법은 Promise
를 사용하는 것이다. Promise가 있으면 그 Promise에 의해 제어되는 Future를 얻을 수 있다.
다음 예제를 보자
scala.concurrent.Promise
를 import시켜 Promise를 사용한다.
pro
에 Int형의 Promise를 선언하고, fut
에는 pro에서 파생된 Future를 생성한다. 위와 같은 방식으로 Promise로부터 Future를 선언하면 Promise에 의해 fut은 제어된다. 그 예로 pro
라는 프로미스에 success 메서드를 사용하여 값을 할당하면 fut 역시 할당이 완료된 것을 볼 수 있다.
Future는 filter
와 collect
라는 메서드를 제공한다. 이들을 사용하면 퓨처값에 대해 성립하는 특성을 확인할 수 있다.
filter를 사용하면 Future의 결과를 검증할 수 있다. 검증 결과가 올바른 경우 그 값을 그대로 남겨두는 역할을 한다. Collection의 filter와 유사한 역할을 한다.
위와 같이 filter는 Future의 결과를 검증하며, 결과가 올바른 경우 남겨두고 올바르지 않은 경우 failure를 발생시킨다.
invalid.value
를 실행하면 NoSuchElementException
이 발생하며 실패한다.
collect
메서드를 사용하면 퓨처값을 검증하고 변환하는 작업을 수행할 수 있다.
collect는 양수인지 퓨처값을 검증하고 맞다면 다음 연산을 지목하는 작업이다. 만약 검증에 실패했다면 failure
가 발생하고, NoSuchElementException
역시 발생한다.