빠르게 훑자 Dart
공식문서 + 영어로 공부하는 것이 제일 빨리 실력이 느는 것 같다
언제나 공식문서부터 읽기! Dart language Samples
Dart는 Google에서 만들었다 보니까 문서가 아주 잘되어 있다.
Language Tour, Libraries Tour도 따로 제공한다.
내 나름대로 정리해보았다.
아직 실력이 부족해 오역이 있을 수 있다.
Hello World
1
2
3
4
| // Hello World
void main() {
print('Hello, World!');
}
|
변수
1
2
3
4
5
6
7
8
9
10
11
| // 변수
// Dart는 type-safe합니다.
// 하지만 타입을 명시하지 않아도 됩니다.
var name = 'Voyager I';
var year = 1977;
var antennaDiameter = 3.7;
var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
var image = {
'tags': ['saturn'],
'url': '//path/to/saturn.jpg'
};
|
흐름제어문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| // 흐름 제어 문
// if-else 문
if (year >= 2001) {
print('21st century');
} else if (year >= 1901) {
print('20th century');
}
// for-each 문
for (var object in flybyObjects) {
print(object);
}
// for 문
for (int month = 1; month <= 12; month++){
print(month);
}
// while 문
while (year < 2016) {
year += 1;
}
// 더 알아보기 : break, continue, switch and case, assert
|
함수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| // 함수
// 권장 : 파라미터와 리턴값 타입을 명시하세요
int fibonacci(int n) {
if (n == 0 || n == 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
var result = fibonacci(20);
// 화살표 함수
// 한 줄로 선언하는 함수입니다.
// 함수 인수로 익명 함수를 넘겨줄 때 유용합니다.
flybyObjects.where((name) => name.contains('turn')).forEach(print);
// 또한, 보다시피 함수를 인수로 사용할 수 있다.
// 최상위 레벨 함수인 print()를 forEach() 함수의 인자로 넘겨줬다.
// 더 알아보기 : optional params, default param vals, and lexical scope
|
주석
1
2
3
4
5
6
| // 주석
// Dart는 //를 사용한다
/// 문서화 주석은 ///를 사용한다
/// IDE등의 도구들이 doc comments를 특별하게 인식한다.
/* 이러한 형태의 주석도 지원한다. */
|
패키지 사용
1
2
3
4
5
| // 패키지 사용
import 'dart:math'; //코어 라이브러리
import 'package:test/test.dart'; //외부 패키지에서의 라이브러리
import 'path/to/my_other_file.dart'; //파일
// 더 알아보기 : library prefixes, show and hide, and lazy loading through the deferred keyword
|
클래스
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
32
33
34
35
36
37
38
| // 클래스
// 예시는 3개의 속성, 2개의 생성자, 1개의 메소드를 갖는다. (+ 게터 메소드)
class Spacecraft {
String name;
DateTime launchDate;
// 생성자
Spacecraft(this.name, this.launchDate) {
// ...
}
// 이름있는 생성자
Spacecraft.unlaunched(String name) : this(name, null);
int get launchYear =>
launchDate?.year; //read-only non-final property
// 메소드
void describe() {
print('Spacecraft: $name');
if (launchDate != null) {
int years =
DateTime.now().difference(launchDate).inDays ~/
365;
print('Launched: $launchYear ($years years ago)';
} else {
print('Unlaunched');
}
}
}
// 위의 예시를 다음과 같이 사용한다
var voyager = Spacecraft('Voyager I', DateTime(1977, 9, 5));
voyager.describe();
var voyager3 = Spacecraft.unlaunched('Voyager III');
voyager3.describe();
// 더 알아보기 : initializer lists, optional new and const,
// redirecting constructors, factory constructors,
// getters, setters, and much more
|
상속
1
2
3
4
5
6
7
8
| // 상속
// 단일 상속만을 갖는다
class Orbiter extends Spacecraft {
double altitude;
Orbiter(String name, DateTime launchDate, this.altitude)
: super(name, launchDate);
}
// 더 알아보기 : extending classes, optional @override annotation, and more
|
믹스인
1
2
3
4
5
6
7
8
9
10
11
12
13
| // 믹스인
// 믹스인이란 다중 클래스 상하관계에서 코드 재사용을 하는 방법이다
// 다음 예시가 믹스인으로 사용할 수 있는 클래스의 예시이다
class Piloted {
int astronauts = 1;
void describeCrew() {
print('Number of astronauts: $astronauts');
}
}
// 위 클래스를 다음과 같이 믹스인 한다 (with)
class PilotedCraft extends Spacecraft with Piloted {
// ...
}
|
인터페이스와 추상 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| // 인터페이스와 추상 클래스
// Dart는 interface 키워드가 없다.
// 모든 클래스들은 암묵적으로 인터페이스를 정의하므로, 어떠한 클래스에서도 implement 할 수 있다.
class MockSpaceship implements Spacecraft {
// ...
}
// 추상 클래스
abstract class Describable {
void describe(); // 추상 메소드(빈 바디)
void describeWithEmphasis() {
print('========');
describe();
print('========');
}
}
|
Async
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
32
33
34
35
| // Async
// 콜백 지옥을 피하기 위함
// 그리고 코드를 좀 더 가독성있게 만들기 위함
// by using async and await
const oneSecond = Duration(seconds: 1);
// ...
Future<void> printWithDelay(String message) async {
await Future.delayed(oneSecond);
print(message);
}
// async and await을 사용하지 않은, 위와 동일한 기능을 하는 예시
Future<void> printWithDelay(String message) {
return Future.delayed(oneSecond).them((_) {
print(message);
});
}
// Async의 가독성을 보여주는 더 확실한 예시
Future<void> createDescriptions(Iterable<String> objects) async {
for (var object in objects) {
try {
var file = File('$object.txt');
if (await file.exists()) {
var modified = await file.lastModified();
print(
'File for $object already exists. It was modified on $modified.');
continue;
}
await file.create();
await file.writeAsString('Start describing $object in this file.');
} on IOException catch (e) {
print('Cannot create description for $object: $e');
}
}
}
// 더 알아보기 : async funcs, Future, Stream, and the asynchronous loop (await for).
|
예외처리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| // 예외처리
// 예외를 발생시키려면 throw
if (astrounauts == 0) {
throw StateError('No astronauts.');
}
// 예외처리에는 try, on, catch를 사용
try {
for (var object in flybyObjects) {
var description = await File('$object.txt').readAsString();
print(description);
}
} on IOException catch (e) {
print('Could not describe object" $e');
} finally {
flybyObjects.clear();
}
// try는 동기 그리고 비동기 함수 둘다 사용 가능하다.
// 더 알아보기 : stack traces, rethrow, and the diff between err and exception
|
댓글남기기