Dart 비동기 프로그래밍(Async & Await) 개념과 내용 그리고 실습 방법등을 정리하여 배울수 있도록 작성하였습니다. 비동기 프로그래밍에 대한 개념 설명 → 실습 예제 2개 → 해설 & 출력 예시 방식으로 만들어져 있사오니 하나 하나 차근차근 시도해보시고 심화하여 역량을 쌓으시길 바래요.
Dart 비동기 프로그래밍 (Async & Await) 심화 학습
⚡. Dart 비동기 프로그래밍 (Async & Await) 심화 학습
느린 작업(예: 인터넷 요청, 파일 읽기)을 기다리지 않고 똑똑하게 처리하는 법!
✅ 1. Future 기본 개념
📘 개념 설명
-
Future는 “미래에 완료될 작업”을 의미해요.
-
시간이 걸리는 작업(네트워크 요청, 파일 다운로드 등)을 기다리지 않고 예약하는 방식이에요.
-
예시: 배달을 시키고, 음식이 올 때까지 다른 일을 하는 것과 같아요!
🏆 실습 예제 1: Future로 지연 작업 만들기
Future<String> fetchData() {
return Future.delayed(Duration(seconds: 2), () => '데이터 도착!');
}
void main() {
fetchData().then((data) => print(data));
print('기다리는 중...');
}
✅ 출력:
기다리는 중...
(2초 후) 데이터 도착!
🏆 실습 예제 2: Future 기본 예제
Future<String> sayHello() {
return Future(() => '안녕하세요!');
}
void main() {
sayHello().then((msg) => print(msg));
}
✅ 출력:
안녕하세요!
✅ 2. async, await 사용법
📘 개념 설명
-
async: 비동기 함수임을 표시
-
await: Future가 끝날 때까지 잠깐 기다렸다가 다음 코드 실행
🏆 실습 예제 1: async & await으로 데이터 가져오기
Future<String> getData() async {
await Future.delayed(Duration(seconds: 1));
return '데이터 완료!';
}
void main() async {
print('요청 중...');
String result = await getData();
print(result);
}
✅ 출력:
요청 중...
(1초 후) 데이터 완료!
🏆 실습 예제 2: 두 개의 비동기 작업 순서대로 실행하기
Future<void> firstTask() async {
await Future.delayed(Duration(seconds: 1));
print('첫 번째 작업 완료');
}
Future<void> secondTask() async {
await Future.delayed(Duration(seconds: 1));
print('두 번째 작업 완료');
}
void main() async {
await firstTask();
await secondTask();
}
✅ 출력:
첫 번째 작업 완료
두 번째 작업 완료
✅ 3. then, catchError 체이닝
📘 개념 설명
-
then: Future가 성공했을 때 실행
-
catchError: 에러가 발생했을 때 처리
-
체이닝으로 여러 작업을 연결해서 깔끔하게 관리 가능
🏆 실습 예제 1: then으로 결과 처리
Future<String> fetchMessage() {
return Future.delayed(Duration(seconds: 1), () => '메시지 도착!');
}
void main() {
fetchMessage().then((msg) => print(msg));
}
🏆 실습 예제 2: 에러 처리 with catchError
Future<String> fetchData() {
return Future.error('서버 오류 발생!');
}
void main() {
fetchData()
.then((data) => print(data))
.catchError((e) => print('에러: $e'));
}
✅ 출력:
에러: 서버 오류 발생!
✅ 4. Stream 개념 및 활용
📘 개념 설명
-
Stream은 여러 개의 데이터를 시간 차를 두고 연속적으로 제공하는 구조
-
예시: 유튜브 라이브 채팅, 센서 데이터, 실시간 알림
🏆 실습 예제 1: 기본 Stream 생성
Stream<int> numberStream() async* {
for (int i = 1; i <= 3; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
void main() {
numberStream().listen((num) => print('숫자: $num'));
}
✅ 출력:
(1초마다) 숫자: 1
숫자: 2
숫자: 3
🏆 실습 예제 2: 문자열 스트림
Stream<String> messageStream() async* {
yield '첫 번째 메시지';
await Future.delayed(Duration(seconds: 1));
yield '두 번째 메시지';
}
void main() {
messageStream().listen((msg) => print(msg));
}
✅ 5. StreamController로 데이터 관리
📘 개념 설명
-
StreamController를 사용하면 내가 직접 스트림에 데이터를 추가하고 관리할 수 있어요.
-
버튼 클릭 같은 이벤트 처리에 활용!
🏆 실습 예제 1: StreamController 기본 사용
import 'dart:async';
void main() {
final controller = StreamController<String>();
controller.stream.listen((data) {
print('받은 데이터: $data');
});
controller.sink.add('Hello');
controller.sink.add('World');
controller.close();
}
✅ 출력:
받은 데이터: Hello
받은 데이터: World
🏆 실습 예제 2: 숫자 데이터 관리
import 'dart:async';
void main() {
final controller = StreamController<int>();
controller.stream.listen((n) => print('숫자: $n'));
for (int i = 1; i <= 3; i++) {
controller.sink.add(i);
}
controller.close();
}
✅ 6. 비동기 반복문 (await for)
📘 개념 설명
-
await for 문법을 사용하면 스트림 데이터를 하나씩 쉽게 처리할 수 있어요.
🏆 실습 예제 1: await for로 스트림 읽기
Stream<String> getMessages() async* {
yield '안녕!';
await Future.delayed(Duration(seconds: 1));
yield '반가워!';
}
void main() async {
await for (var msg in getMessages()) {
print(msg);
}
}
🏆 실습 예제 2: 숫자 스트림 반복 출력
Stream<int> getNumbers() async* {
for (int i = 1; i <= 2; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
void main() async {
await for (var num in getNumbers()) {
print('번호: $num');
}
}
🎓 마무리 요약
개념 |
설명 |
---|---|
Future |
미래에 완료될 작업 |
async / await |
비동기 코드를 쉽게 작성 |
then / catchError |
체이닝으로 결과 & 에러 처리 |
Stream |
여러 데이터를 시간차로 전달 |
StreamController |
직접 데이터 관리 |
await for |
스트림을 반복문처럼 처리 |
💡 실전 활용 예시
-
서버 API 호출
-
실시간 채팅 앱
-
Flutter에서 비동기 UI 업데이트
-
파일 다운로드 진행 상황 표시
댓글 쓰기