본문 바로가기
Dart/Dart 100제

Dart 100제 36 ~ 40 (비동기 프로그래밍)

by Maccrey Coding 2024. 7. 24.
반응형

36. 비동기 함수 작성하기

문제: 비동기 함수와 await를 사용하여 결과를 반환하세요.

 

import 'dart:async';

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return '데이터 로드 완료';
}

void main() async {
  print('데이터를 불러오는 중...');
  String result = await fetchData();
  print(result);
}

위의 코드는 fetchData라는 비동기 함수를 정의하고, await 키워드를 사용하여 함수의 결과를 기다립니다.

Future.delayed는 2초 후에 완료되는 Future를 반환하며, 이를 통해 비동기 작업을 시뮬레이션합니다.

main 함수에서 await를 사용하여 비동기 함수의 결과를 기다리고 출력합니다.

37. Future 사용하기

문제: Future를 반환하는 함수를 작성하고 결과를 출력하세요.

 

import 'dart:async';

Future<String> fetchUserData() {
  return Future.delayed(Duration(seconds: 3), () => '사용자 데이터 로드 완료');
}

void main() {
  fetchUserData().then((data) {
    print(data);
  });
}

위의 코드는 fetchUserData라는 Future를 반환하는 함수를 정의하고, Future.delayed를 사용하여 3초 후에 데이터를 반환합니다. main 함수에서 then 메서드를 사용하여 Future가 완료되었을 때의 결과를 처리합니다.

38. Stream 사용하기

문제: 데이터를 스트림으로 처리하고 결과를 출력하세요.

 

import 'dart:async';

Stream<int> countStream(int max) async* {
  for (int i = 1; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() {
  countStream(5).listen((data) {
    print('스트림 데이터: $data');
  });
}

위의 코드는 countStream이라는 비동기 스트림 함수를 정의하고, async*와 yield를 사용하여 데이터를 생성합니다.

main 함수에서는 listen 메서드를 사용하여 스트림 데이터를 구독하고 출력합니다.

스트림을 통해 1초 간격으로 숫자를 생성하여 출력합니다.

39. 비동기 에러 처리하기

문제: 비동기 함수에서 발생하는 에러를 처리하는 방법을 설명하세요.

 

import 'dart:async';

Future<String> fetchDataWithError() async {
  await Future.delayed(Duration(seconds: 2));
  throw Exception('데이터 로드 실패');
}

void main() async {
  try {
    String result = await fetchDataWithError();
    print(result);
  } catch (e) {
    print('에러 발생: $e');
  }
}

위의 코드는 fetchDataWithError라는 비동기 함수에서 의도적으로 예외를 발생시키고, main 함수에서 try-catch 블록을 사용하여 에러를 처리합니다.

await로 비동기 함수의 결과를 기다리다가 에러가 발생하면 catch 블록에서 에러를 잡아 출력합니다.

40. HTTP 요청 보내기

문제: HTTP GET 요청을 보내고 응답을 출력하세요.

 

import 'dart:convert';
import 'dart:io';

Future<void> fetchApiData() async {
  final url = 'https://jsonplaceholder.typicode.com/posts/1';
  final response = await HttpClient().getUrl(Uri.parse(url)).then((request) => request.close());
  final responseBody = await response.transform(utf8.decoder).join();
  final data = jsonDecode(responseBody);
  print('API 응답: $data');
}

void main() async {
  await fetchApiData();
}

위의 코드는 HttpClient를 사용하여 HTTP GET 요청을 보내는 프로그램입니다.

getUrl 메서드를 사용하여 요청을 보내고, then 메서드를 사용하여 응답을 받습니다.

응답은 utf8.decoder를 사용하여 디코딩한 후, jsonDecode를 사용하여 JSON 데이터를 파싱합니다.

fetchApiData 함수는 비동기 함수이며, main 함수에서 이를 호출하고 결과를 출력합니다.

 

위의 예제들은 Dart 언어를 사용하여 비동기 프로그래밍을 다루는 다양한 방법을 보여줍니다.

비동기 함수, Future, Stream, 에러 처리, 그리고 HTTP 요청을 통해 비동기 작업을 효율적으로 처리하는 방법을 익힐 수 있습니다.

반응형