Menu
CoddyTech

클래스 메서드에서의 비동기 처리

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 110개 중 80번째.

팩토리 메서드를 사용해 비동기 초기화를 처리하는 방법을 배웠으니, 이제 일반 인스턴스 메서드를 비동기식으로 만드는 방법을 살펴보겠습니다. 간단합니다. 메서드에 async를 추가하고 Future를 반환하게 하면 됩니다.

class WeatherService {
  String _location;
  
  WeatherService(this._location);
  
  Future<String> fetchTemperature() async {
    await Future.delayed(Duration(seconds: 1));
    return '22°C in $_location';
  }
  
  Future<void> updateLocation(String newLocation) async {
    await Future.delayed(Duration(milliseconds: 500));
    _location = newLocation;
    print('Location updated to $_location');
  }
}

Future<void> main() async {
  var service = WeatherService('London');
  var temp = await service.fetchTemperature();
  print(temp);
  
  await service.updateLocation('Paris');
}

비동기 메서드도 일반 메서드와 마찬가지로 인스턴스 변수를 읽고 수정할 수 있습니다. 중요한 차이점은 호출하는 쪽에서 결과에 await를 사용해야 한다는 것입니다. Future<void>를 반환하는 메서드는 값을 반환하지 않지만, 계속 진행하기 전에 메서드가 완료되도록 하려면 여전히 await를 사용해야 합니다.

메서드 내에서 여러 비동기 호출을 결합하거나 같은 클래스의 다른 비동기 메서드를 호출할 수도 있습니다.

Future<String> getFullReport() async {
  var temp = await fetchTemperature();
  var humidity = await fetchHumidity();
  return '$temp, Humidity: $humidity';
}

이 패턴은 API, 데이터베이스 또는 시간이 걸리는 작업과 같은 외부 리소스와 상호작용하는 클래스에 필수적입니다.

challenge icon

챌린지

쉬움

비동기 메서드를 사용해 주가를 관리하고 포트폴리오 가치를 계산하는 주식 포트폴리오 추적기를 만들어 봅시다! 실시간 주식 데이터를 가져오는 것을 시뮬레이션하고 여러 비동기 작업을 결합해 보고서를 생성하는 클래스를 만들 거예요.

코드를 두 개의 파일로 구성합니다.

  • portfolio.dart: 주식과 보유 수량을 추적하는 StockPortfolio 클래스를 만듭니다. 클래스에는 다음이 있어야 합니다.
    • 주식 기호와 보유 주식 수를 저장하는 _holdings라는 비공개 Map<String, int>
    • _holdings를 빈 맵으로 초기화하는 생성자
    • 주식 보유 항목을 추가하거나 업데이트하는 메서드 addStock(String symbol, int quantity) (비동기가 아님)
    • Future<double>를 반환하는 비동기 메서드 fetchPrice(String symbol). 50밀리초의 지연을 시뮬레이션한 다음, 기호의 길이에 25.5를 곱해 계산한 가격을 반환합니다.
    • Future<double>를 반환하는 비동기 메서드 getStockValue(String symbol). 해당 기호에 대해 fetchPrice를 기다리고, 그 결과에 보유 수량을 곱한 뒤 총 가치를 반환합니다. 보유 항목에 해당 기호가 없으면 0.0을 반환합니다.
    • Future<double>를 반환하는 비동기 메서드 getTotalValue(). 각 주식에 대해 getStockValue를 기다리고 결과를 합산하여 모든 보유 주식의 총 가치를 계산합니다.
    • Future<String>을 반환하는 비동기 메서드 generateReport(). 각 주식의 가치와 총액을 보여 주는 보고서를 작성합니다. 각 줄은 [symbol]: $[value] 형식으로 표시하고(값은 소수점 이하 1자리), 마지막 줄은 Total: $[totalValue] 형식으로 표시합니다(역시 소수점 이하 1자리).
  • main.dart: 포트폴리오 파일을 가져오고 클래스 안에서 비동기 메서드들이 어떻게 함께 작동하는지 보여 줍니다.
    • StockPortfolio 인스턴스를 만듭니다.
    • 다음 보유 주식을 추가합니다. AAPL 10주, GOOGL 5주, MSFT 8주
    • Fetching portfolio data...을 출력합니다.
    • generateReport()의 결과를 기다린 다음 출력합니다.

generateReport()가 같은 클래스 안의 다른 비동기 메서드를 호출하고 각 메서드가 서로를 기반으로 작업하는 방식을 살펴보세요. 소수점 값을 형식화하려면 toStringAsFixed(1)을 사용하세요!

예상 출력:

Fetching portfolio data...
AAPL: $1020.0
GOOGL: $637.5
MSFT: $816.0
Total: $2473.5

직접 해보기

import 'portfolio.dart';

void main() async {
  // TODO: StockPortfolio 인스턴스 생성

  // TODO: 보유 종목 추가:
  // - AAPL 주식 10주
  // - GOOGL 주식 5주
  // - MSFT 주식 8주

  // TODO: "Fetching portfolio data..." 출력

  // TODO: generateReport()의 결과를 기다린 후 출력
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Dart 컴파일러