Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- DART
- oracle
- 신재생에너지 발전설비 기사
- 자바
- 유닉스
- write by GPT-4
- 데이터베이스
- write by chatGPT
- spring integration
- mobile programming
- 인프라
- spring data jpa
- 자바네트워크
- chatGPT's answer
- 고전역학
- 코틀린
- Java
- 소프트웨어공학
- GPT-4's answer
- flutter
- flet
- NIO
- 역학
- jpa
- 리눅스
- 시스템
- 파이썬
- kotlin
- python
- Database
Archives
- Today
- Total
기억을 지배하는 기록
Dart 비동기 프로그래밍 본문
728x90
Dart 비동기 프로그래밍 (Asynchronous Programming)
Dart는 비동기 프로그래밍(Asynchronous Programming)을 지원하여 네트워크 요청, 파일 읽기, 데이터베이스 작업과 같이 시간이 걸리는 작업을 효율적으로 처리할 수 있습니다.
Dart의 비동기 프로그래밍 핵심 요소:
- Future: 비동기 작업을 나타내는 객체
- async & await: 비동기 함수 정의 및 실행
- Stream: 여러 개의 비동기 데이터를 순차적으로 처리
1. Future란?
- Future는 미래에 완료될 값(비동기 작업의 결과)을 나타내는 객체
- 시간이 걸리는 작업이 완료되면 결과 값을 반환하거나 예외를 발생
- Future는 단일 값을 반환함 (여러 값 처리 시 Stream 사용)
1.1. Future 기본 사용법
Future<String> fetchData() {
return Future.delayed(Duration(seconds: 2), () {
return "데이터 로드 완료!";
});
}
void main() {
fetchData().then((data) {
print(data); // 2초 후 "데이터 로드 완료!" 출력
});
print("로딩 중..."); // 즉시 실행
}
로딩 중...
(2초 후)
데이터 로드 완료!
- 비동기 작업이 완료되면 .then()을 통해 결과를 처리할 수 있음
1.2. Future의 catchError()를 사용한 예외 처리
Future<String> fetchData() {
return Future.delayed(Duration(seconds: 2), () {
throw "데이터 가져오기 실패!"; // 오류 발생
});
}
void main() {
fetchData()
.then((data) => print(data))
.catchError((error) => print("오류 발생: $error"));
print("로딩 중...");
}
로딩 중...
(2초 후)
오류 발생: 데이터 가져오기 실패!
- catchError()를 사용하여 비동기 작업 중 발생한 오류를 처리할 수 있음
2. async & await 사용
- async 함수 내부에서 await을 사용하면 비동기 작업이 완료될 때까지 기다린 후 실행됨
- await을 사용하면 코드를 동기 방식처럼 작성 가능
2.1. async와 await 기본 사용법
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return "데이터 로드 완료!";
}
void main() async {
print("로딩 중...");
String data = await fetchData();
print(data);
}
로딩 중...
(2초 후)
데이터 로드 완료!
- await fetchData();는 비동기 작업이 완료될 때까지 대기
2.2. try-catch를 사용한 예외 처리
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
throw "데이터 가져오기 실패!"; // 오류 발생
}
void main() async {
print("로딩 중...");
try {
String data = await fetchData();
print(data);
} catch (e) {
print("오류 발생: $e");
}
}
로딩 중...
(2초 후)
오류 발생: 데이터 가져오기 실패!
- try-catch를 사용하면 비동기 함수에서 발생한 오류를 안전하게 처리할 수 있음
3. Future.wait()을 사용한 여러 개의 비동기 작업 실행
Future.wait()은 여러 개의 Future를 동시에 실행하고, 모든 작업이 완료될 때까지 기다립니다.
Future<String> fetchUser() async {
await Future.delayed(Duration(seconds: 2));
return "사용자 데이터";
}
Future<String> fetchPosts() async {
await Future.delayed(Duration(seconds: 3));
return "게시글 데이터";
}
void main() async {
print("데이터 불러오는 중...");
List<String> results = await Future.wait([fetchUser(), fetchPosts()]);
print(results[0]); // 사용자 데이터
print(results[1]); // 게시글 데이터
}
데이터 불러오는 중...
(2초 후) 사용자 데이터
(3초 후) 게시글 데이터
- 여러 개의 Future를 병렬로 실행하여 시간을 단축할 수 있음
4. Stream: 여러 개의 비동기 데이터 처리
- Future는 단일 값 반환, Stream은 여러 개의 값을 순차적으로 반환
- 이벤트(데이터 스트림)가 발생할 때마다 값을 받을 수 있음
4.1. Stream 기본 사용법
Stream<int> numberStream() async* {
for (int i = 1; i <= 5; i++) {
await Future.delayed(Duration(seconds: 1));
yield i; // 데이터 반환
}
}
void main() async {
print("스트림 시작...");
await for (int value in numberStream()) {
print("받은 값: $value");
}
print("스트림 종료!");
}
스트림 시작...
(1초 후) 받은 값: 1
(1초 후) 받은 값: 2
(1초 후) 받은 값: 3
(1초 후) 받은 값: 4
(1초 후) 받은 값: 5
스트림 종료!
- await for를 사용하면 Stream 데이터를 쉽게 처리할 수 있음
4.2. listen()을 사용하여 Stream 구독
void main() {
Stream<int> stream = Stream.periodic(Duration(seconds: 1), (x) => x).take(5);
stream.listen(
(data) => print("받은 값: $data"),
onDone: () => print("스트림 종료!"),
);
}
(1초 후) 받은 값: 0
(1초 후) 받은 값: 1
(1초 후) 받은 값: 2
(1초 후) 받은 값: 3
(1초 후) 받은 값: 4
스트림 종료!
- listen()을 사용하면 비동기 데이터를 실시간으로 처리 가능
5. Completer를 사용하여 커스텀 비동기 작업 생성
Completer를 사용하면 수동으로 Future를 완료시킬 수 있습니다.
import 'dart:async';
Future<String> loadData() {
Completer<String> completer = Completer();
Future.delayed(Duration(seconds: 2), () {
completer.complete("데이터 로드 완료!"); // Future 완료
});
return completer.future;
}
void main() async {
print("로딩 중...");
String result = await loadData();
print(result);
}
로딩 중...
(2초 후)
데이터 로드 완료!
- Completer는 수동으로 Future를 제어할 때 사용됨
6. Dart 비동기 프로그래밍 정리
개념 | 설명 |
Future | 단일 비동기 작업 수행 |
.then() | Future 결과를 처리 |
async / await | 비동기 작업을 동기 코드처럼 작성 |
try-catch | 예외 처리 |
Future.wait() | 여러 개의 Future 동시 실행 |
Stream | 여러 개의 비동기 데이터 처리 |
await for | Stream 데이터를 반복적으로 처리 |
listen() | Stream을 구독하여 실시간 데이터 처리 |
728x90
'Flutter for Beginners' 카테고리의 다른 글
Dart 개발자 가이드 (코딩 스타일 & 협업 가이드) (0) | 2025.02.25 |
---|---|
Dart: Generics, Static, Cascade Operator (0) | 2025.02.25 |
Dart 믹스인 (Mixin) (0) | 2025.02.25 |
Dart 객체지향 프로그래밍 - 상속(Inheritance) (0) | 2025.02.24 |
Dart 객체지향 프로그래밍 - 클래스와 객체 (0) | 2025.02.24 |
Comments