ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [개발일지] Dart 입문 4: Asynchronous Programming
    Study/Development 2022. 8. 21. 21:29

     

    <인프런 코드팩토리 강의 수강일지>

     

    1. Future

    void main() {
      // Future: 미래
      // 미래에 받아올 값
    
      Future<String> name = Future.value('코팩');
      Future<int> number = Future.value(1);
      Future<bool> isTrue = Future.value(true);
    
      print('함수 시작');
    
      // 2개의 파라미터
      // delayed - 지연되다
      // 1번 파라미터 - 지연할 기간 (얼마나 지연할 건지) Duration
      // 2번 파라미터 - 지연 시간이 지난 후 실행할 함수
    
      Future.delayed(Duration(seconds: 3), () {
        print('Delay 끝'); // 함수 시작 후 3초 뒤에 실행된다.
      });
    }

     

    void main() {
      // Future: 미래
      // 미래에 받아올 값
    
      Future<String> name = Future.value('코팩');
      Future<int> number = Future.value(1);
      Future<bool> isTrue = Future.value(true);
    
      addNumbers(1,1);
      addNumbers(2,2);
    }
    
    void addNumbers(int num1, int num2) {
      print('계산 시작: $num1 + $num2');
    
      // 서버 시뮬레이션
      Future.delayed(Duration(seconds: 2), () {
        print('계산 완료: $num1 + $num2 ');
      });
    
      print('함수완료');
    }
    
    //계산 시작: 1 + 1
    //함수완료 -> 기다리는 동안 다음 명령 시작
    //계산 시작: 2 + 2 -> 기다리는 동안 다음 명령 시작
    //함수완료 -> 기다리는 동안 다음 명령 시작
    //계산 완료: 1 + 1 -> 2초 뒤 완료
    //계산 완료: 2 + 2 -> 2초 뒤 완료

     

    2. async - await

    void main() {
      addNumbers(1,1);
      addNumbers(2,2);
    }
    
    void addNumbers(int num1, int num2) async {
      print('계산 시작: $num1 + $num2');
    
      // 서버 시뮬레이션
      await Future.delayed(Duration(seconds: 2), () {
        print('계산 완료: $num1 + $num2 = ${num1 + num2}');
      });
      // await 사용하여 시간 만큼 기다릴 수 있고, 다른 작업을 실행할 수 있다.
    
      print('함수완료');
    }
    
    // 계산 시작: 1 + 1
    // 계산 시작: 2 + 2
    // 계산 완료: 1 + 1 = 2
    // 함수완료
    // 계산 완료: 2 + 2 = 4
    // 함수완료

     

    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 num1, int num2) async {
      print('계산 시작: $num1 + $num2');
    
      // 서버 시뮬레이션
      await Future.delayed(Duration(seconds: 2), () {
        print('계산 완료: $num1 + $num2 = ${num1 + num2}');
      });
      // await 사용하여 시간 만큼 기다릴 수 있고, 다른 작업을 실행할 수 있다.
    
      print('함수완료');
      
      return num1 + num2; // return 하여 받아올 수 있음.
    }

     

    3. Stream

    import 'dart:async'; // stream 사용 시 임포트
    
    void main() {
      final controller = StreamController();
      final stream = controller.stream.asBroadcastStream();
      //여러번 리스닝 가능
    
      final streamListener1 = stream.where((val) => val % 2 == 0).listen((val) {
        print('Listener 1 : $val'); // 짝수만 전달
      });
    
      final streamListener2 = stream.where((val) => val % 2 != 0).listen((val) {
        print('Listener 2 : $val'); // 홀수만 전달
      });
    
      controller.sink.add(1); // listener에 값을 전달
      controller.sink.add(2);
      controller.sink.add(3);
      controller.sink.add(4);
      controller.sink.add(5);
    }
    
    // Listener 2 : 1
    // Listener 1 : 2
    // Listener 2 : 3
    // Listener 1 : 4
    // Listener 2 : 5
    import 'dart:async';
    
    void main() {
      calculate(2).listen((val){
        print('calculate(2): $val');
      });
      
        calculate(4).listen((val){
        print('calculate(4): $val');
      });
    }
    
    Stream<int> calculate(int number) async* {
      for (int i = 0; i < 5; i++) {
        yield i * number;
        
        await Future.delayed(Duration(seconds:1)); // 비동기로 동시에 출력
      }
    }
    
    // calculate(2): 0
    // calculate(4): 0
    // calculate(2): 2
    // calculate(4): 4
    // calculate(2): 4
    // calculate(4): 8
    // calculate(2): 6
    // calculate(4): 12
    // calculate(2): 8
    // calculate(4): 16
    //yield 마무리 후 다음 yield
    
    import 'dart:async';
    
    void main() {
      playAllStream().listen((val) {
        print(val);
      });
    }
    
    Stream<int> playAllStream() async* {
      yield* calculate(1); //yield*을 붙이면 함수 완료된 후 다음작업 실행
      yield* calculate(1000); // await와 유사
    }
    
    Stream<int> calculate(int number) async* {
      for (int i = 0; i < 5; i++) {
        yield i * number;
    
        await Future.delayed(Duration(seconds: 1)); // 비동기로 동시에 출력
      }
    }
    
    // 0
    // 1
    // 2
    // 3
    // 4
    // 0
    // 1000
    // 2000
    // 3000
    // 4000
    반응형

    댓글

© 2023. titann all rights reserved