비동기 프로그래밍
하나의 작업뿐만 아닌, 동시에 여러 작업을 수행할 수 있게 해주는 프로그래밍
Dart에서는 Future, await, async, Stream을 사용해 비동기 프로그래밍을 한다.
Future
Future는 나중에 실행할 코드들을 정의할 때 사용한다.
Future<String> sendData() {
return Future.delayed(Duration(seconds: 3), (){
return 'Send Your Data';
});
}
void main() {
print('Data를 보내는 중...');
sendData().then((data) {
print(data);
});
}
Future를 사용한 sendData 함수는 3초 뒤 'Send Your Data'라는 문자열을 반환한다.
Future의 then 메서드는 인자로 반한환 값을 받아온다.
then의 매개변수 data에 sendData 함수에서 반한된 Send Your Data라는 값을 넣고 출력하게 된다.
결과:
async, await
함수에 async 키워드를 넣으면 이 함수는 await을 사용할 수 있는 비동기 함수임을 나타낸다.
Future<String> robotStarter() {
return Future.delayed(Duration(seconds: 3), () {
return '구동되었습니다.';
});
}
Future<String> start() {
return Future.delayed(Duration(seconds: 1), () {
return '작동이 시작되었습니다,';
});
}
Future<void> userButton() async {
print('전원이 들어왔습니다.');
String data = await robotStarter();
print(data);
String starter = await start();
print(starter);
}
void main() {
userButton();
print('현재 가동 가능 로봇 3개');
}
로봇에 전원이 들어오는 것 부터 구동과 작동까지의 과정이다.
제일 먼저 메인 함수에서 userButton 함수를 실행 '전원이 들어왔습니다'와 같이 '현재 가능 로봇3개'를 출력
userButton 함수는 async 키워드를 사용해서 비동기 함수이고, await을 사용할 수 있다.
await은 Future로 만든 함수가 끝날 때 까지 다른 코드를 일시정지 시키는 기능을 한다.
결과:
3초 뒤에 '구동되었습니다.' 가 출력되고 출력된 1초 이후에 '작동이 시작되었습니다.'가 출력된다.
Stream
순차적으로 데이터들을 처리하는 기능, 리스너(listen)를 연결해 Stream에서 발생하는 데이터를 받아 처리한다.
import 'dart:async';
void main() {
Stream<String> robotPower = Stream.fromIterable(['arms','leg','body','head']);
robotPower.listen((part) {
print('$part가 구동되었습니다.');
});
}
로봇의 부분들이 하나씩 구동되는 모습을 예로 들었다.
구동되는 파트가 Stream에서 발생하는 데이터, listen 메서드로 Stream이 발생시키는 데이터를 매개변수로 받을 수 있게된다.
listen() 메서드는 데이터를 받아오는 역할도 하지만 에러가 났거나 모든 데이터를 받은 후 Stream을 종료시키는 역할도 한다.
import 'dart:async';
void main() {
Stream<String> robotPower = Stream.fromIterable(['arms','leg','body','head']);
robotPower.listen(
(part) {
print('$part가 구동되었습니다.');
},
onDone: () {
print('구동 완료');
},
onError: (error) {
print('구동 실패 Error: $error');
},
cancelOnError: false
);
}
listen() 메서드의 매개변수인 onDone이나 onError 등으로 좀 더 기능을 확장했다.
onDone : 데이터 처리가 끝나면 실행되는 코드
onError : 데이터 처리중 에러 발생시 에러코드 출력
cancelOnError : 에러 발생시 Stream을 정지할지 여부
결과:
'Dart > Flutter' 카테고리의 다른 글
Flutter로 앱 만들기 - 11. Container와 Column(행), Row(열) (0) | 2024.06.23 |
---|---|
Flutter로 앱 만들기 - 10. MaterialApp의 위젯 정리 (0) | 2024.06.22 |
Flutter로 앱 만들기 - 8. Dart 클래스 (0) | 2024.06.20 |
Flutter로 앱 만들기 - 7. Dart의 함수 (1) | 2024.06.20 |
Flutter로 앱 만들기 - 6. Dart의 기본 문법 정리 (0) | 2024.06.20 |