동기 프로그래밍(Synchronous Programming)
- 작업이 완료될 때까지 기다렸다가 결과가 나오면 값을 반환
- 결과값이 나올 때까지 다른 모든 연산이 멈추므로 다른 작업을 할 수 없음
비동기 프로그래밍(Asynchronous Programming)
- 작업이 완료될 때까지 기다리지 않고, 미래의 특정 시점에 값을 반환
- 결과값이 나올 때까지 멈춰 있지 않고, 수행할 수 있는 다른 작업을 찾아서 수행함
- 시간이 오래 걸리는 작업을 처리할 때 사용
- dart:async 라이브러리의 Future, Stream 같은 클래스를 이용하여 비동기 프로그래밍 구현
- Future
- 비동기 프로그래밍에서 사용되는 대표적인 클래스
- dart:core가 Future 클래스를 사용 가능하게 해주어서 따로 dart:async를 import 필요 없음
- 작업이 성공적으로 완료되었을 때 해당 결과값을 반환하고 실행을 종료함
- 반환값의 타입은 Future
- 제네릭 클래스
- 하나의 작업에 대해 값이나 이벤트가 한 번 발생하는 단일 비동기 작업에 사용됨
- Future의 delayed() 메서드
- Future.delayed(Duration(seconds: 지연시간));
- Future.delayed(Duration(seconds: 지연시간), {지연 시간 후의 동작});
- 비동기 코드를 동기 코드처럼 순서대로 실행하고 싶을 때는 비동기 코드 앞에 await를 붙이고, awai이 붙은 코드를 포함하는 함수에 async를 붙인다.
- 하나의 작업당 결과값을 한 번만 받을 수 있음
- 하나의 작업에 결과값이 여러 번 나올 때는 Stream 사용
- Stream
- 비동기 프로그래밍에서 사용되는 대표적인 클래스
- Dart:async에 포함되어 있는 클래스
- dart:core가 Future 클래스를 사용 가능하게 해주어서 따로 dart:async를 import 필요 없음
- 시간에 따라 연속적인 데이터 흐름을 제공함
- 한 번에 하나의 값이 아닌 여러 값을 비동기적으로 받을 수 있음
- 결과값을 한 번 반환하고 나면 실행이 종료되는 Future과 다르게 직접 실행을 종료해 주어야 실행이 종료되고 실행을 종료하지 않으면 계속 실행됨
- 반환값의 타입은 Stream
- 제네릭 클래스
- 하나의 작업에 대해 값이나 이벤트가 여러 번 발생하는 경우에 사용. ex) 사용자가 버튼을 누를 때마다 그 이벤트를 받아오는 경우
- 비동기 연산의 결과값이 여러 번 반환되는 경우 그 값을 순차적으로 받기 위해 사용
- async대신 async*을 사용
- yield
- 값을 방출하도록 하는 키워드
- Stream에서는 반환 대신 방출이라는 단어 사용
- 함수와 메서드에서 사용하는 return과 같은 개념
- listen()
- 방출되는 소리를 듣고 있는다는 뜻
- yield를 통해 방출되는 값을 받기 위해 사용하는 메서드
- yield를 통해 방출되는 값들이 순서대로 하나씩 listen의 매개변수로 들어간다.