Study/Development

[개발일지] Dart 입문 4: Asynchronous Programming

titann 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
반응형