Dart 언어의 큰 특징 6가지
함수 앞에 Future
를 붙이고 중괄호 앞에async
, 해당 함수를 await
로 받는다.
void main() {
checkVersion();
print('end Process');
}
Future checkVersion() async {
var version = await lookUpVersion(); // suspend
print(version);
}
int lookUpVersion () {
return 12;
}
end process
12
다트는 싱글 스레드 언어이다.
그래서 비동기 구문을 잘 활용해야한다. (suspend)
다트에서 JSON을 다루기 위해서는 convert 라이브러리를 포함해야 한다.
import 'dart:convert';
void main() {
var jsonString = '''
[
{"score": 40},
{"score": 80}
]
''';
var scores = jsonDecode(jsonString);
print(scores is List);
var firstScore = scores[0];
print(firstScore is Map);
print(firstScore['score'] == 40);
}
is 타입을 체크하는 예약어
위와 같이 jsonDecode()를 통해 서버에서 받은 데이터를 처리할 수 있다.
반대로 json형태로 애플레케이션에서 서버로 전송도 가능하다.
import 'dart:convert';
void main() {
var scores = [
{'score': 40},
{'score': 80},
{'score': 100, 'overtime': true, 'special_guest': null}
];
var jsonText = jsonEncode(scores);
print(jsonText == '[{"score":40},{"score":80},{"score":100,"overtime":true,"special_guest":null}]');
}
서버에서 데이터를 순서대로 처리해야하는 경우가 생긴다. 이 경우 스트림을 이용한다.
스트림은 FIFO구조로 짜여진다.
import 'dart:async';
Future<int> sumStream(Stream<int> stream) async {
var sum = 0;
await for (var value in stream) {
print('sumStream : $value');
sum += value;
}
return sum;
}
Stream<int> countStream(int to) async* {
for(int i = 1; i <= to; i++) {
print('countStream : $i');
yield i;
}
}
void main() async {
var stream = countStream(10);
var sum = await sumStream(stream);
print(sum);
}
yield는 yield는 지속적으로 데이터를 내보내는 예약어 (유지되는 return)
void main() {
Car bmw = Car(320, 100000, 'BMW');
Car benz = Car(250, 70000, 'BENZ');
Car ford = Car(320, 80000, 'FORD');
bmw.selectCar();
bmw.selectCar();
bmw.selectCar();
print(bmw.price);
}
class Car {
String name = '';
int maxSpeed= 0;
num price = 0;
Car(int maxSpeed, num price, String name) {
this.name = name;
this.price = price;
this.maxSpeed = maxSpeed;
}
int selectCar() {
price = price * 0.9;
return price;
}
}
출처: 플러터 앱 프로그래밍 - 조준수 지음