Friday, August 18, 2023

Dart의 FutureOr 이해와 예제로 살펴보기

들어가며: Dart와 FutureOr<T> 소개

Dart는 구글에서 개발한 웹, 서버, 모바일 애플리케이션 개발을 위한 플랫폼 독립적인 프로그래밍 언어입니다. 이번 포스트에서는 Dart에서 제공하는 특별한 타입인 FutureOr<T>에 대해 설명하고 예제를 통해 살펴보겠습니다.

비동기 프로그래밍이 필수적인 모던 웹 개발에 Dart는 많은 도움을 줍니다. Dart에서 비동기 작업은 Future라는 객체를 사용하여 처리하게 됩니다. 또한, 비동기 작업의 결과를 처리하기 위해 아직 완료되지 않은 Future와 완료된 값을 합쳐서 표현할 수 있는 FutureOr<T> 타입을 제공합니다.

이 포스트에서는 다음과 같은 내용을 다루게 됩니다:

  • FutureOr<T>의 정의와 원리
  • FutureOr<T> 활용 사례와 예제
  • 정리 및 마무리

이제, Dart 언어의 FutureOr<T>에 대해 알아보기 위한 여행을 시작해보겠습니다.

FutureOr<T>의 정의와 원리

먼저, FutureOr<T>는 Dart의 타입 시스템에서 'T 타입의 값을 가진 작업을 생성할 수 있는 것(T value를 가진 Future이거나, 직접 가진 값이 T일 것)이라는 것을 의미합니다. 이러한 표현 방식을 사용하면 결과 값이 Future 또는 T일 수 있는 비동기 작업을 유연하게 처리할 수 있습니다.

FutureOr<T>는 다음과 같은 상황에서 유용하게 쓰입니다:

  • 동기 작업과 비동기 작업이 혼합된 경우
  • 한 함수나 메소드에서 동기 작업과 비동기 작업이 반환되는 경우
  • 비동기 작업이 완료될 때까지 실행을 일시 중단하거나 기다렸다가 계속 진행해야 하는 경우

이해를 돕기 위해, 아래 코드 예시를 살펴봅시다:

import 'dart:async';

FutureOr<int> getValue() async {
  return await Future.delayed(Duration(seconds: 1), () => 10);
}

void main() async {
  final value = await getValue();
  print('Value is: ' + value.toString());
}

위 예시 코드에서 getValue 함수는 FutureOr<int> 타입을 반환합니다. 반환 값을 await를 사용하여 비동기 결과로 받아올 수 있습니다. 이 경우, 'Value is: 10'이 출력됩니다.

타입을 FutureOr<T>로 지정함으로써, 일관된 인터페이스를 통해 동기와 비동기 값을 전달할 수 있게 됩니다. 이것이 FutureOr<T>의 원리입니다.

다음 장에서는 이 원리를 활용한 구체적인 사례와 예제를 살펴보겠습니다.

FutureOr<T> 활용 사례 및 예제

이제, FutureOr<T>의 활용 사례와 예제를 살펴보겠습니다. 다음의 예시는 FutureOr<T>를 사용하여 동기 작업과 비동기 작업을 하나의 인터페이스로 처리하는 방법을 보여줍니다.

import 'dart:async';

FutureOr<String> fetchData(bool fromServer) async {
  if (fromServer) {
    return await Future.delayed(Duration(seconds: 1), () => 'Data from server');
  } else {
    return 'Data from cache';
  }
}

void main() async {
  final serverData = await fetchData(true);
  print(serverData);

  final cacheData = await fetchData(false);
  print(cacheData);
}

위 코드 예시에서 fetchData 함수는 bool 타입의 매개변수를 받아서, 참(true)일 경우 서버로부터 데이터를 가져오는 것을 시뮬레이션하고 거짓(false)일 경우 캐시로부터 데이터를 가져옵니다. 함수 반환 값의 타입은 FutureOr<String>입니다.

서버로부터 데이터를 가져올 때는 1초 후에 값을 얻는 비동기 작업으로 처리되며, 캐시에서 데이터를 가져올 때는 동기 작업으로 처리됩니다. 이렇게 동시에 동기와 비동기 작업을 관리할 수 있습니다.

import 'dart:async';

FutureOr<int> multiply(int a, int b) {
  return a * b;
}

FutureOr<String> getResult(int result) async {
  return await Future.delayed(Duration(seconds: 1), () => 'Result: $result');
}

void main() async {
  final value = await getResult(multiply(5, 2));
  print(value.toString()); // Output: Result: 10
}

위 코드 예시에서 multiply 함수는 두 개의 정수 값을 곱하여 결과를 반환하며, 동기 작업으로 처리됩니다. getResult 함수는 받은 결과를 비동기로 처리하여 문자열로 변환해 줍니다. 여기서도 FutureOr<T>의 유연성을 활용할 수 있습니다.

이러한 예제를 통해 FutureOr<T>를 효과적으로 사용하여 동기와 비동기 작업을 일관된 인터페이스로 관리할 수 있음을 확인하였습니다. 다음 장에서는 정리 및 마무리를 진행하겠습니다.

정리 및 마무리

이 포스트에서는 Dart 프로그래밍 언어의 FutureOr<T>에 대해 살펴보았습니다. FutureOr<T>는 동기와 비동기 작업을 하나의 유연한 인터페이스로 처리할 수 있게 해주는 타입으로, 모던 웹 프로그래밍에서 많은 도움을 줍니다. 다음과 같은 내용을 다뤘습니다:

  • FutureOr<T>의 정의와 원리
  • FutureOr<T> 활용 사례 및 예제

이를 통해 FutureOr<T>의 기본 개념 및 활용 방법에 대해 이해할 수 있었습니다. 이제 Dart 언어를 활용하여 동기와 비동기 작업을 더 효율적으로 관리하고 웹, 서버, 모바일 애플리케이션을 개발할 수 있게 되었습니다.

마지막으로, 지속적인 학습과 연습을 통해 이러한 개념을 정확하게 숙지하고 능숙하게 활용할 수 있도록 노력하는 것이 중요합니다. 많은 실전 프로젝트에서 성공적인 코딩 경험을 쌓아나가길 바랍니다.

감사합니다.


0 개의 댓글:

Post a Comment