[Dart]Future

한상욱·2022년 12월 27일
0

Dart문법

목록 보기
14/15
post-thumbnail

비동기에 대하여

이번 포스팅부터 비동기식 방식에 대해서 다루게 될 것입니다. Flutter로 앱을 제작하는 데 있어서, Future와 Stream은 뗄 수 없는 문법입니다. 그 중 이번 포스팅에서는 Future에 대해서 알아보겠습니다.

동기와 비동기에 대해서 먼저 이해할 필요가 있겠습니다. 어떤 것이 동기다 비동기다는 어떤 사건을 처리하는 시간 간격이 일정한지 일정하지 않은지를 판별하는 것을 의미합니다.

어떤 공장에서 물건을 포장하는데 각각 5초씩 걸린다고 하겠습니다. 이럴 경우, 모든 일이 5초안에 이루어지기 때문에 동기식이라고 할 수 있습니다. 반대로, 물건 종류에 따라서 포장시간에 차이가 있는 공장이 있다고 하겠습니다. 이때는 아까와 다르게 비동기식이라고 할 수 있습니다.

조금 감이 잡히셨는지요?? 그렇다면 Dart에서 동기와 비동기가 왜 필요한지 이제 설명하겠습니다. 아시겠지만은 Dart로 이루어진 코드는 CPU에 의해서 동작하게 됩니다. 그리고 코드를 순서대로 처리하게 됩니다. 이 시간동안에 CPU의 메모리는 오직 이 코드를 위해 사용됩니다. 그리고 처리가 끝난 후, 다음 코드를 수행하기 위해 메모리를 할당하게 되는 것이죠.

근데, 서버로 api 요청을 보내서 응답을 받아서 처리하는 코드가 있다면, 일반적인 코드보다 더 오랜 시간이 걸릴겁니다. 응답을 받기 전까지는 메모리가 이 코드만을 할당했기에 다음 코드를 실행시키지 않고, 오직 이 작업을 위해 할당했기에 다음 코드실행까지 오랜시간이 걸리게 되는 것입니다. 이러면 전체적인 코드의 실행속도가 떨어지게 되겠군요. 이 문제를 해결하는 것이 바로 비동기식입니다.

비동기식으로 처리를 하게 되면, 서버로 요청을 보낸 후 응답을 받기 전까지 다음 코드를 수행하고, 응답을 받으면 다시 코드를 수행하게 됩니다. 이로써 전체적인 실행속도를 향상시키는 것입니다. 그리고 대표적으로 이런 비동기식을 사용하는 방식이 Future와 Stream입니다.

Future

Future, 말 그대로 미래라는 뜻입니다. Dart에서도 값을 후에 전달받기 때문에 Future라고 부르는 것 같습니다. 그렇다면 예시를 한번 볼까요??
delay라는 변수는 3초동안 작업한다고 하겠습니다.

void main() {
  var delay = Future.delayed(Duration(seconds: 3));
  delay.whenComplete(() => print('3초동안 작업함'));
}
>> 3초동안 작업함

위 코드는 delay라는 변수에 3초동안의 지연을 준 후, 수행이 완료되면 print메소드를 실행하는 코드입니다. 실제로 이 코드를 수행하면, 결과가 바로 나타나지 않고, 3초 후 나타납니다. 정말인지 보여드릴게요. 저 코드 밑에 print메소드를 하나 넣어보겠습니다.

void main() {
  
  var delay = Future.delayed(Duration(seconds: 3));
  delay.whenComplete(() => print('3초동안 작업함'));
  print('3초 안지남');
}
>> 3초 안지남
>> 3초동안 작업함

Dart는 순서대로 처리한다고 했기 때문에, 바로바로 결과가 나왔다면, 당연히 결과의 순서가 바뀌어야겠지요??

Future메소드

flutter로 앱을 제작하면 가장 많이 사용하는 것이 바로 Future메소드 입니다. 예시먼저 보시고 설명들어갈게요.

void main() {
  api();
}

Future<void> api() async{
  await Future.delayed(Duration(seconds: 3));
  print("응답받음");
}
>> 응답받음

이 예제 코드는 서버로 어떤 api를 보내고, 응답을 받는과정까지를 가정한 메소드입니다. 저런식으로 메소드 타입 앞에 Future를 붙이고, 제너릭값을 이용해서 return타입을 결정할 수 있습니다. 이렇게 생성된 메소드는 꼭 파라미터와 실행 {}사이에 async 키워드를 붙여주셔야하고, 그 내부에서 오래걸리는 내용은 await키워드를 이용해서 실행시켜야 합니다. async가 없으면 await도 에러가 표시됩니다. 마찬가지로 Future로 선언된 메소드는 async 키워드가 없으면 에러가 표시됩니다.

profile
자기주도적, 지속 성장하는 모바일앱 개발자가 되기 위해

0개의 댓글