Group Study (2024-2025)/Flutter

[Flutter] 2주차 스터디_비동기 프로그래밍(Async Programming )

yukjjim 2024. 10. 9. 15:59
  • 동기 프로그래밍
    : CPU가 하나의 작업을 하고 있을 경우, 다른 작업을 하지못함
    --> 코드 순서대로 실행됨

Synchronous Programming

  • 비동기 프로그래밍
    :CPU가 하나의 작업이 끝날 때까지 기다리는 동안 다른 작업을 할 수 있음
    --> 코드 순서대로 실행되지 않음

Asynchronous Programming

4.1 비동기 프로그래밍(Asynchronous Programming)

  • Future : 미래에 받아올 값 → 제네릭에 미래에 받아올 타입을 지정
    ex) Future name = Future.value('코드팩토리'); 비동기적으로 실행
void main() {
  // Future - 미래
  // 미래에 받아올 값 → 제네릭에 미래에 받아올 타입을 지정하는 것임
  Future<String> name = Future.value('코드팩토리');
  Future<int> number = Future.value(1);
  Future<bool> isTrue = Future.value(true);
  
  print('함수 시작');

  addNumbers(1, 1);
  addNumbers(2, 2);
}

void addNumbers(int number1, int number2)  {
  print('계산 시작 : $number1 + $number2');

  // 서버 시뮬레이션
   // 2개의 파라미터
  // delayed - 지연되다.
  // 1번 파라미터 - 지연할 기간 (얼마나 지연할건지) Duration
  // 2번 파라미터 - 지연 시간이 지난 후 실행할 함수
  Future.delayed(Duration(seconds: 2), () {
    print('계산 완료: $number1 + $number2 = ${number1 + number2}');
  });

  print('함수 완료: $number1 + $number2');
}
  • await, async
    비동기로 실행되는 곳에서 동기적으로 순서대로 실행하게끔 함
    Future를 리턴하는 곳에서 사용가능함
    await를 사용하기 위해 async를 함수정의시, 매개변수 뒤에 작성
    --> 함수를 호출하는 경우에도 동기적으로 실행하게끔하려면
    main함수에도 다른 함수들처럼 async을 작성해줌
void main() async{
  // 함수를 호출시 동기화
  final result1 = await addNumbers(1, 1); 
  final result2 = await addNumbers(2, 2); 
  
  print('result1: $result1');
  print('result2: $result2');
  print('result1 + result2 = ${result1 + result2}');
}

// 함수 내부적인 코드에서 동기화
Future<int> addNumbers(int number1, int number2) async {
  print('계산 시작 : $number1 + $number2');

  // 서버 시뮬레이션
  await Future.delayed(Duration(seconds: 2), () {
    print('계산 완료: $number1 + $number2 = ${number1 + number2}');
  });

  print('함수 완료: $number1 + $number2');
  return number1+ number2;
}

4.2 스트링(Stream)

import 'dart:async'; 를 통해서 필요한 내용들을 불러온다 리스너를 등록줌으로써 스트림에 있는 값들이 실행되도록한다.

  • where 함수
    stream의 리스너 작성시, where함수로 필터링 가능 ex) final streamListener2 = stream.where((val)=> val % 2 == 1).listen((val){ print('Listener 2: $val'); });
import 'dart:async';

void main(){
  final controller = StreamController();
  final stream = controller.stream.asBroadcastStream();

  // stream에 where함수로 필터링
  //짝수 stream
  final steramListener1 = stream.where((val)=> val % 2 == 0).listen((val){
    print('Listener 1: $val');
  });
  
  // 홀수 stream
  final streamListener2 = stream.where((val)=> val % 2 == 1).listen((val){
    print('Listener 2: $val');
  });
  
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4); 
  controller.sink.add(5); 
}
  • yield, async*
    yield로 하나의 함수에서 여러값을 계속 반환할 수 있음
    cf) return을 쓰는 경우 함수가 종료된다
    함수로 스트림을 반환할 수 있음, async* 작성해줘야함
  • yield*, async*
    yield* 뒤에 있는 값들을 모두 반환한 뒤에 다음 코드가 실행됨
    Stream을 await를 쓰는 것과 같은 효과를 줌
    async*를 작성해줘야함
import 'dart:async';

void main(){
  playAllStream().listen((val){
    print(val);
  });
}

// Stream을 await처럼 쓸 수 있게됨
Stream<int> playAllStream() async* {
  yield* calculate(1);
  yield* calculate(1000);
}

Stream<int> calculate(int number) async* {
  for (int i =0; i< 5; i++){
    yield i* number;
    
    await Future.delayed(Duration(seconds: 1));
  }
}

 

주의할 점


비동기 프로그래밍이기 때문에 코드 순서대로만은 실행되지 않기 때문에

코드 작성도 작성이지만, 실행 결과에 집중해서 공부할 필요가 있어보인다. 


참고 자료 

[코드팩토리] [입문] Dart 언어 4시간만에 완전정복 - Dart #4 Asynchoronous Programming 비동기 프로그래밍