공부내용

dart 문법_동기, 비동기2

골목코딩 2024. 10. 8. 17:27

async, await, Future 개념이 어려워 챗GPT에게 설명해달라 요청했다.

 

**async, await, Future**는 Dart와 같은 언어에서 비동기 프로그래밍을 처리하기 위한 중요한 개념입니다. 비동기 처리는 프로그램이 즉각 완료되지 않는 작업을 처리할 때 유용합니다. 예를 들어, 서버에서 데이터를 가져오거나 파일을 읽는 작업은 시간이 걸리기 때문에, 프로그램이 이를 기다리지 않고 다른 작업을 진행할 수 있게 해줍니다.

1. 비동기 프로그래밍이란?

비동기 프로그래밍은 시간이 오래 걸리는 작업이 완료될 때까지 기다리지 않고, 다른 작업을 계속 진행할 수 있도록 하는 방식입니다. 예를 들어, 파일을 읽거나 네트워크 요청을 보내는 작업은 시간이 걸리기 때문에, 이런 작업을 동기적으로 처리하면 프로그램이 멈춘 것처럼 보일 수 있습니다. 비동기 프로그래밍을 사용하면 이런 작업들이 백그라운드에서 처리되며, 그 작업이 끝날 때까지 기다릴 필요 없이 다른 코드를 실행할 수 있습니다.

2. Future란?

**Future**는 미래에 완료될 작업을 나타내는 객체입니다. Future는 현재는 값이 없지만, 나중에 값을 반환하거나 오류가 발생할 수 있는 비동기 작업을 나타냅니다.

  • 완료 전: 비동기 작업이 아직 끝나지 않았습니다.
  • 성공적으로 완료: 작업이 완료되고 값을 반환합니다.
  • 실패: 작업이 실패하고 오류를 반환합니다.

예시: Future의 사용

Future<String> fetchData() {
  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 사용 예시

Future<String> fetchData() async {
  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은 이를 동기 코드처럼 처리하게 해줍니다.

예시: 서버에서 데이터를 가져오는 경우

Future<String> fetchUserData() async {
  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**는 "택배가 도착할 때까지 기다릴게"라고 말하는 것과 같습니다.

이렇게 생각하면 비동기 작업이 왜 중요한지, 그리고 어떻게 작동하는지 이해하기 더 쉬울 거예요!