플러터 (flutter)

Dart의 동기와 비동기 코딩

CreatoMaestro 2023. 6. 16. 22:24
반응형

지금까지는 코드가 순서대로 진행되는 동기 프로그래밍을 알아보았다.

이제부터는 코드의 순서가 달라질 수 있는 비동기 프로그래밍에 대해 알아본다.

 

1. Future

Future는 미래에 어떠한 일을 하거나 값을 받아올 것임을 의미한다.

void main() {
  return_String(); //Future.delayed를 면저 실행
  print("1");
  print("2");
  print("3");
}

void return_String() {
//Future.delayed 함수는 Duration을 통해 실행 시점을 제어할 수 있다.
  Future.delayed(Duration(seconds: 2), () { 
    print("Future String");
  });
}

Future 실행 결과
실행 결과

실행결과를 보면 return_String 함수를 먼저 실행했음에도 불구하고 프린트가 맨 뒤에 나오는 것을 확인할 수 있다.

이는 cpu가 delay시간 동안 기다리면서 다른 일을 처리했기 때문에 발생하는 현상이다.

 

2. await 과 async

async 키워드는 비동기로 코드를 처리한다는 의미이다.

이 키워드를 사용하면 어떤 데이터를 받을 때 시간이 오래 걸리면, 받는 동안 기다리지 않고 다음 코드를 실행하는 것이 가능하다.

async는 함수의 소괄호(파라미터 설정하는 곳)와 중괄호 사이에 적어준다.

 

await 키워드는 해당 코드가 다 실행되길 기다려야 하는 경우 사용한다.

다음 코드를 살펴보자

void main() {
  return_String("First", 3); //첫 번째 함수는 3초 대기
}

void return_String(String a, int time) async {
  print("$a start!");
  Future.delayed(Duration(seconds: time), () {
    print("$a end!");
  });
  print("end?");
}

async 실행 결과
실행 결과

async가 return_String 함수에 쓰여졌다.

이 코드의 경우 Future.delay가 진행되는 동안 그다음 코드인 'print("end?");'가 실행된다.

그렇기에 'end?'가 먼저 쓰이고 그다음에 'First end!'가 뜬다.

 

await은 이 순서를 바꾼다.

void main() {
  return_String("First", 3); //첫 번째 함수는 3초 대기
}

void return_String(String a, int time) async {
  print("$a start!");
  await Future.delayed(Duration(seconds: time), () {
    print("$a end!");
  });
  print("end?");
}

await 실행 결과
실행 결과

코드를 보면 Future.delay 앞에 await 키워드가 쓰인 것을 확인할 수 있다.

await이 붙었기 때문에 컴퓨터는 Future.delay가 다 끝날 때까지 기다려야 한다.

그렇기에 'First end!'가 뜨고 그다음 'end?'가 뜨게 된다.

 

3. Stream

Stream은 여러 값을 받아와야 하는 경우 사용한다.

Stream에서 값을 받아오면 listen() 함수를 통해 그 값을 받아올 수 있다.

import 'dart:async';

void main() async {
  final controller = StreamController();

  controller.stream.listen((event) {
    print(event);
  });

  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
  controller.sink.add(5);
}

 

StreamController를 통해 stream을 생성시켜 준다.

이후 stream.listen()을 통해 값을 받아오고 어떤 코드를 실행할지 적어준다.

이때 함수를 소괄호 안에 넣어주어야 한다.(파라미터로 함수를 받는다.)

 

controller의 sink.add() 메서드를 통해 값을 넣어준다.

 

하나의 stream을 여러 listen함수에서 듣고 싶을 경우 asbroadcastStream()을 사용해 준다.

import 'dart:async';

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

  streamer.listen((event) {
    print("listener1 : $event");
  });

  streamer.listen((event) {
    print("listener2 : $event");
  });

  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
  controller.sink.add(5);
}

실행 결과는 다음과 같다.

Stram 실행 결과
실행 결과

Stream과 비동기 통신에 대해서는 이해가 깊지 않아 좀 더 공부하고 내용을 보강할 생각이다.

반응형

'플러터 (flutter)' 카테고리의 다른 글

Flutter와 위젯(Widget)  (0) 2023.06.21
Flutter 개발 환경 구축하기  (0) 2023.06.19
Dart 클래스 (2) - 프로젝트1_1  (0) 2023.06.16
Dart Class - 프로젝트1_1  (0) 2023.06.14
Dart의 기본 (2) - 프로젝트1_1  (0) 2023.06.11