Dart 문법

Dart 문법(6)

hamiric 2024. 11. 4. 11:37

동기 프로그래밍

코드상에 적힌 대로, 순차적으로 작업이 진행되는 프로그래밍 방식

결과값이 나올 때까지 다른 모든 연산이 멈추기 때문에, 한번에 하나씩의 작업을 수행하게 된다.

 

비동기 프로그래밍

여러 작업이 있을때, 하나의 작업이 완료될 때까지 기다리지 않고 동시에 여러가지 작업을 수행하는 방식의 프로그래밍

결과값이 나올 때까지 다른 모든 연산이 멈추는 것이 아니기 때문에 다른 작업을 계속 할 수 있다.

 

비동기 프로그래밍 키워드

Future

제네릭 타입으로써, 비동기 프로그래밍에서 사용되는 대표적인 클래스라고 할 수 있다.

작업이 성공적으로 완료되었을 때 해당 결과값을 반환하고, 실행을 종료한다.

// 일반적 형태로 사용하는 future
Future<int> n = Future.value(3);
Future<String> name = Future.value('김철수');
Future<bool> isNum = Future.value(tryParse('2'));
// 함수 형태로 사용하는 future
// 이 경우, <T> 타입이 있을 경우 return 이 필요!
// await이 있을경우 async가 필요하다
Future<void> number() async{
    // 비동기적으로 실행할 코드
    // return; ( 현재는 void 타입이라 return 없어도 됨 )
}

 

< 주요 기능(메서드) >

  • delayed
// Duration을 사용하여, 일정시간동안 코드 실행을 대기하는 메서드
// 간단한 방식
Future.delayed(Duration(seconds: 2));
// 여러 함수 작동 방식
Future.delayed(Duration(seconds: 2), () {
    // 실행 코드
}

 

  • then
// 비동기 작업이 성공적으로 완료된 경우, 결과를 처리하는 콜백을 등록하는 메서드
Future<int> a = Future.value(10);
a.then((n) => print(n));

 

  • wait
// 여러 future들을 비동기적으로 실행한 후, 모든 future가 완료될때까지 기다린 다음 결과를 리스트로 반환하는 메서드
Future<int> a = Future.value(10);
Future<int> b = Future.value(20);
Future.wait([a,b]).then((n)=>print(n));  // [10,20]

 

  • any
// 여러 future들을 비동기적으로 실행한 후, 먼저 완료된 future값을 반환하는 메서드
// 먼저 완료된 future값만 반환한다 하더라도, 리스트에 포함된 future들은 자체적으로 완료될 때까지 수행됨
Future<int> a() => Future.delayed(Duration(seconds: 2), () => 10);
Future<int> b() => Future.delayed(Duration(seconds: 1), () => 20);
Future.any([a(), b()]).then((n) => print(n));  // 20

 

  • timeout
// 주어진 시간이 지나도 future가 완료되지 않으면, TimeoutException을 발생
Future<int> a = Future.delayed(Duration(seconds: 3), () => 10);
a.timeout(Duration(seconds: 2)).catchError((error) => print('Timed out'));

 

Stream

제네릭 타입으로써, 비동기 프로그래밍에서 사용되는 대표적인 클래스라고 할 수 있다.

시간에 따라 연속적인 데이터 흐름을 제공하며, 한번에 하나의 값이 아닌 여러 값을 비동기적으로 받을 수 있다.

// 일반적 형태로 사용하는 Stream
Stream<int> n = Stream.value(3);
Stream<String> name = Stream.value('김철수');
Stream<bool> isNum = Stream.value(tryParse('2'));
// 함수 형태로 사용하는 Stream
// Stream은 값을 '방출' 할때, return이 아닌 yield 를 사용한다.
// yield로 Stream을 사용할때, 위의 yield 부터 순차적으로 작업을 수행한다. (방출되는 순서 보장)
// yield를 사용할 경우 async*가 필요하다.
Stream<String> name() async*{
    // 비동기적으로 실행할 코드
    yield '김철수';
    yield '김기자';
    yield '강철수';
}

 

< 주요 기능(메서드) >

  • listen

Stream이 '방출'하고 있는 값을 받는 메서드

Stream<int> Numbers() async* {
    yield 1;
    yield 2;
    yield 3;
}

...
Numbers().listen((num) {
    print(num);
});

// 123

'Dart 문법' 카테고리의 다른 글

JsonData 변환  (0) 2024.11.28
클래스 생성자 방식  (0) 2024.11.18
Dart 문법(5)  (0) 2024.11.01
Dart 문법(4)  (0) 2024.10.28
Dart 문법(3)  (0) 2024.10.28