dart 문법_동기, 비동기2
async, await, Future 개념이 어려워 챗GPT에게 설명해달라 요청했다.
**async, await, Future**는 Dart와 같은 언어에서 비동기 프로그래밍을 처리하기 위한 중요한 개념입니다. 비동기 처리는 프로그램이 즉각 완료되지 않는 작업을 처리할 때 유용합니다. 예를 들어, 서버에서 데이터를 가져오거나 파일을 읽는 작업은 시간이 걸리기 때문에, 프로그램이 이를 기다리지 않고 다른 작업을 진행할 수 있게 해줍니다.
1. 비동기 프로그래밍이란?
비동기 프로그래밍은 시간이 오래 걸리는 작업이 완료될 때까지 기다리지 않고, 다른 작업을 계속 진행할 수 있도록 하는 방식입니다. 예를 들어, 파일을 읽거나 네트워크 요청을 보내는 작업은 시간이 걸리기 때문에, 이런 작업을 동기적으로 처리하면 프로그램이 멈춘 것처럼 보일 수 있습니다. 비동기 프로그래밍을 사용하면 이런 작업들이 백그라운드에서 처리되며, 그 작업이 끝날 때까지 기다릴 필요 없이 다른 코드를 실행할 수 있습니다.
2. Future란?
**Future**는 미래에 완료될 작업을 나타내는 객체입니다. Future는 현재는 값이 없지만, 나중에 값을 반환하거나 오류가 발생할 수 있는 비동기 작업을 나타냅니다.
- 완료 전: 비동기 작업이 아직 끝나지 않았습니다.
- 성공적으로 완료: 작업이 완료되고 값을 반환합니다.
- 실패: 작업이 실패하고 오류를 반환합니다.
예시: Future의 사용
return Future.delayed(Duration(seconds: 3), () => 'Data loaded');
}
void main() {
print('Start fetching data');
fetchData().then((data) {
print(data);
});
print('Continue with other work');
}
위 예시에서:
- fetchData() 함수는 3초 후에 'Data loaded'를 반환하는 비동기 함수입니다.
- then() 메서드는 Future가 완료되면 그 값을 받아 처리합니다.
- 중요: 비동기 작업을 기다리지 않고, "Continue with other work"가 바로 출력됩니다.
3. async와 await
async와 await는 비동기 코드를 더 읽기 쉽게 작성할 수 있도록 도와주는 키워드입니다.
- async: 함수에 async 키워드를 붙이면, 그 함수는 비동기 함수가 됩니다. 즉, Future를 반환하는 함수로 변환됩니다.
- await: await 키워드를 사용하면 비동기 작업이 완료될 때까지 기다립니다. 이때, 코드의 실행은 잠시 멈추지만, 다른 작업은 계속됩니다.
async와 await 사용 예시
return Future.delayed(Duration(seconds: 3), () => 'Data loaded');
}
void main() async {
print('Start fetching data');
String data = await fetchData(); // fetchData가 완료될 때까지 기다립니다.
print(data);
print('Continue with other work');
}
위 코드에서:
- fetchData() 함수는 async로 선언되어, 비동기 함수로 동작합니다.
- await fetchData()는 fetchData()가 완료될 때까지 기다린 후, 그 결과를 변수 data에 저장합니다.
- 덕분에 then() 같은 메서드를 쓰지 않고, 동기적인 방식으로 코드를 작성할 수 있어 읽기 쉬워집니다.
4. async, await, Future를 함께 사용
Future는 비동기 작업을 표현하고, async와 await은 이를 동기 코드처럼 처리하게 해줍니다.
예시: 서버에서 데이터를 가져오는 경우
print('Fetching user data...');
await Future.delayed(Duration(seconds: 2)); // 서버에서 데이터를 가져온다고 가정
return 'User data received';
}
void main() async {
print('Start');
String data = await fetchUserData(); // 데이터를 가져올 때까지 기다립니다.
print(data); // 'User data received'가 출력됩니다.
print('Done');
}
이 예시에서:
- fetchUserData()는 데이터를 가져오기 위해 2초 동안 대기한 후 데이터를 반환합니다.
- await 덕분에 동기적으로 데이터를 가져오는 것처럼 코드를 작성할 수 있습니다.
- 그러나 프로그램은 멈추지 않고, 비동기 작업을 기다리는 동안에도 다른 작업을 수행할 수 있습니다.
5. 요약
- Future: 미래에 완료될 비동기 작업을 나타냅니다. 결과나 오류를 처리할 수 있습니다.
- async: 함수에 async를 붙이면 비동기 함수가 되며, Future를 반환합니다.
- await: await 키워드는 비동기 작업이 완료될 때까지 기다리게 만듭니다. 하지만 코드 실행은 멈추지 않습니다.
비유로 이해하기:
- **Future**는 택배를 주문한 후 "언젠가 도착할 것이다"라는 약속입니다. 택배가 올 때까지 우리는 다른 일을 할 수 있습니다.
- **async**는 "내가 지금 택배를 주문할게"라고 말하는 것이고,
- **await**는 "택배가 도착할 때까지 기다릴게"라고 말하는 것과 같습니다.
이렇게 생각하면 비동기 작업이 왜 중요한지, 그리고 어떻게 작동하는지 이해하기 더 쉬울 거예요!