이번에 쓸 글은 Dart 비동기의 시작 바로 바로
Future.wait() 함수는 하나의 Future로 구성된 리스트를 매개변수로 입력받습니다. Future.wait()에 입력된 함수들은 모두 동시에 실행되며 응답값을 요청을 보낸 순서대로 저장해둡니다(호출한 순서대로 응답값을 받지는 않습니다.)
비동기 프로그래밍은 요청한 결과를 기다리지 않으며 응답 순서 또한 요청한 순서와 다를 수 있다.
그렇기에 자원을 낭비하지 않고 더 효율적으로 코드를 실행할 수 있다.
예) 데이터베이스에서 데이터를 가져오는 작업, 복잡한 계산 혹은 이미지 인코딩 작업
시간이 걸리는 작업을 동기로 실행하면 실행 속도가 느려질 수 있기 때문에 비동기로 처리해야한다.
Future 클래스는 단어의 의미대로 미래에 받아올 값을 의미한다. 제네릭으로 어떤 미래의 값을 받아올지 정할 수 있다.
Future<String> name;
Future<int> number 등...
비동기 프로그래밍은 서버 요청과 같이 오래 걸리는 작업을 기다린 후 값을 받아와야 하기 때문에 미래값을 표현하는 Future 클래스가 필요하다.
void main() {
addNumbers(1,2);
// 1 + 1 계산 시작
// 코드 실행 끝
// 2
}
void addNumber(int number1, int number2) {
print('$number1 + $number2 계산 시작);
Future.delayed(Duration(seconds: 3), () {
print(number1 + number2);
});
print('코드 실행 끝');
}
위와 같은 코드를 예로 보았을 때 우선 특정 기간동안 아무것도 하지 않고 기다리는 Future.delayed()를 사용해서 테스트를 해보았다.
예상결과)
계산시작
2
코드 실행 끝
실제결과)
계산시작
코드 실행 끝
2
위 코드를 실행했을 때 결과가 첫 번째 문단의 순서대로 이루어져야 한다. 하지만 Future.delayed() 가 비동기 연산이기 때문에 CPU가 3초간 대기해야 한다는 메시지를 받으면 리소스를 허비하지 않고 다음 코드를 바로 실행한다.
결과적으로 CPU가 아무것도 하지 않으며 낭비할 뻔한 시간(3초) 동안 다른 작업을 할 수 있어 더 효율적으로 CPU 리소스를 활용한 것이 되는 거다.
Future 클래스를 사용하게되면 코드가 작성된 순서대로 실행되지 않는다. 이럴 경우 프로그래머 입장에서 헷갈릴 가능성이 있다. 이 때 async & await 키워드를 사용하면 비동기 프로그래밍을 유지하면서 코드 가독성을 유지할 수 있다.
void main() {
addNumbers(1, 2);
}
Future<void> addNumbers(int a, int b) async {
print('a + b 계산 시작');
await Future.delayed(Duration(second: 3), () {
print(a + b);
});
print('코드 실행 끝');
}
예상결과)
계산시작
코드 실행 끝
2
실제결과)
계산시작
2
코드 실행 끝
위 코드와 같이 함수를 async로 지정해주고 대기하고 싶은 비동기 함수를 실행할 때 await 키워드를 사용해주면 코드를 작성한 순서대로 실행하게 된다. 이렇게 되면 비동기 프로그래밍이 아니라 동기 프로그래밍이라고 생각할 수 있지만, async & await 키워드를 사용하면 비동기 프로그래밍 특징을 유지하면서 코드가 작성된 순서대로 프로그램을 실행한다.
나는 이 부분이 이해가 되지 않아 많이 답답했다.
비동기적인 이점을 가져가면서 결과는 동기 화면이라....
옆에 계신 프론트 분에게 비동기에 대해 물어봤지만 나에게는 이해가 어려운 말만 도착했을 뿐이었다.
그래서 고르고 고른 바로 바로 ChatGpt!!
내가 맞게 이해한 것이라면 비동기적으로 실행을 한뒤 결과를 표시해줄 때는 결과가 준비 되면 그 때 맞춰서 표시해주는 것이라고 이해했다.
내가 맞게 이해했길 바라며....
void main() async {
final result = await addNumbers(1, 1);
print(result);
final result2 = await addNumbers(2, 2);
print(result2);
}
Future<int> addNumbers(int a, int b) {
print('a+b');
await Future.delayed(Duration(second: 3), () {
print(a+b);
})
print('코드 실행 끝');
return a + b;
}
결과 )
1 + 1
2
코드 실행 끝
2
2 + 2
4
코드 실행 끝
4
async & await 키워드를 사용한 함수에도 일반적인 함수처럼 결괏값을 받아낼 수 있다.