Future를 이해하려면 우선 동기(synchronous)와 비동기(asynchronous)를 먼저 알아야 한다.
동기(synchronous)와 비동기(asynchronous)
말 그대로 요청과 결과가 동시에 이루어지는 것을 뜻한다. 만약 데이터베이스에서 자료를 받을 경우 100여개의 데이터를 하나씩 순서대로 처리한다면 시간이 너무 오래 걸릴 것이다. 그에 비해 비동기 방식은 요청을 받으면 동시에 출발해서 처리한다. 늦게 출발했어도 먼저 도착할 수 있다.
동기방식은 설계가 매우 간단하고 직관적이지만 결과가 주어질 때까지 아무것도 못하고 대기해야 하는 단점이 있고, 비동기방식은 동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있다.
Future의 기본코드는 다음과 같다.
Future<String> helloWorld() {
return Future.delayed(Duration(seconds: 3), () {
return "Hello World";
});
왜 Future를 async-await와 같이 사용하나?
Future는 대부분 API 데이터를 받아서 뿌려주는 데 사용된다. Future.then을 쓴다면 코드도 지저분하지만, 문제는 콜백지옥에 빠져 앱이 다운될 수도 있고, 시간 내에 온전한 정보를 받지 못해 불완전한 결과를 띄운다는 점이다. 하지만 async-await를 쓰면 한 줄의 코드가 실행이 늦어져도 다른 줄에 영향을 미치지 않는다.
또한 코드가 여러 줄일 때 async-await는 코드를 훨씬 알아보기 쉽게 해준다.
Future initData() async {
person = await getData();
images = await getImages();
setState(() {});
}
Future 함수를 사용할 경우, 결과값을 가져왔는지 아닌지 알기 위해 변수에 값이 담기지 않고 null이라면 로딩화면을 띄우고 값이 들어오면 화면에 띄우는 조건문이 필요하다.
Future과제를 하며 배운 것들
- 조건을 걸려면 bool값인 true/false를 주는 변수를 설정해야 한다.
- 로딩할 때 동그라미가 돌아가는 명령어는 CircularProgressIndicator()다.
- 랜덤으로 숫자를 생성해주는 코드는 Random().nextInt(숫자)이다.
숫자가 10일 경우, (즉, Random().nextInt(10)), 랜덤하게 나오는 숫자는 1~9이다. 이걸 주의해야 한다.