Dart/Flutter

Flutter로 앱 만들기 - 9. Dart 비동기

wtc 2024. 6. 21. 12:15

비동기 프로그래밍

하나의 작업뿐만 아닌, 동시에 여러 작업을 수행할 수 있게 해주는 프로그래밍

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라는 값을 넣고 출력하게 된다.

 

결과:  

3초 뒤 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을 정지할지 여부

 

결과: