Dart 2.12
홈페이지 : https://dart.dev/
매뉴얼 : https://dart.dev/guides
테스트 환경 : DartPad
- Dart와 Flutter의 웹 테스트 환경
Flutter
Flutter 앱 개발을 위한 프로그래밍 언어
JavaScript 또는 원시 기계코드로 컴파일 가능
- 멀티 플랫폼 상에서 동작되도록 하는 앱을 위해 디자인된 프로그래밍 언어
- 문법은 C와 거의 동일
- 다른 언어의 장점을 추가하여 간결하고 강력한 기능을 제공
- VS code, IntelliJ, 안드로이드 스튜디오 정도의 IDE
- 아직은 호불호가 갈리는 언어
- Dart Native
- 모바일, 데스크톱, 서버, 임베디드등을 대상으로 하는 디바이스의 경우 사용
- Dart 인터프리터, JIT 컴파일러, AOT 컴파일러 포함
선언과 변수
//----------------------------------------------------------
//--- 주석
//----------------------------------------------------------
// 주석
/** 주석 **/
/// 문서 주석. dartdoc 도구를 사용하여 문서 생성시 사용
//----------------------------------------------------------
//--- import, export
//----------------------------------------------------------
import 'dart:core';
import 'data:io';
import 'dart:io' show Platform; //--- platform만 사용
import 'data:math' hide flow; //--- flow만 사용 않음
import 'data:convert';
import 'data:html';
import 'package:flutter/material.dart' as lib1;
import 'package:flutter/widgets.dart' hide Flow;
import '~.dart';
//--- as 뒤는 소문자와 "_"만 사용 가능
//--- as 뒤가 전체 dart 문서를 가르킨다.
import 'package:flutter/material.dart' defferred as lib22;
await lib22.loadLibrary();
library material;
export 'src/material/ablout.dart';
//----------------------------------------------------------
//--- 변수
//----------------------------------------------------------
//--- 변수 타입
// Numbers (int, double)
// Strings (String)
// Booleans (bool)
// Lists (List, also known as arrays)
// Sets (Set)
// Maps (Map)
// Runes (Runes; often replaced by the characters API)
// Symbols (Symbol)
// The value null (Null)
//
// Object, Enum
// Future, Stream
// Naver, dynamic, void
//--- 선언
final String name; //--- 최종 변수
const String name; //--- 상수
late String name; //--- 할당시 변수 생성
int? value = null; //--- null을 가질수 있는 변수
//--- var : 한번 타입이 결정되면 변경이 불가
var? var001 = null; //--- 동적 타입
//--- dynamic : 타입이 계속 변경 가능
dynamic? var002 = null; //--- 동적 타입
name.runtimeType
name.hashCode
//--- Numbers (int, double)
var age = 1;
var hex = 0xDEADBEEF;
var exponents = 1.42e5;
num age = 1;
int age = int.parse('1');
double age = double.parse('1.1');
1.toString();
3.14159.toStringAsFixed(2);
//--- Strings (String)
String name = 'This is ${name}';
String desc = '''
~
''';
//--- Booleans (bool)
bool flag = true; //--- true, false
//--- List
List nums = const [ 1, 2, 3 ]; //--- index : 0, 1, 2, ...
var nav = ['Home', 'Plants', if (promoActive) 'Outlet'];
var listOfStrings = ['#0', for (var i in listOfInts) '#$i'];
List list02 = [...nums]; //--- nums의 깊은 복사
List list02 = [...?nums]; //--- nums의 깊은 복사
List list11 = [ {}, {} ];
List list12 = list.map((i) => {...i}).toList(); //--- 깊은 복사
//--- 깊은 복사를 하면서 값도 변경
List list12 = list.map((i) => {...i, 'name': value}).toList();
nums.forEach(function(num) {});
names.map((name) => {}); //--- Iterable을 반환
names.map((name) => 반환값).toList(); //--- List 반환
names.where((name) => 조건문).toList();
names.firstWhere((name) => 조건문);
names.singleWhere((name) => 조건문);
names.takeWhile((name) => 조건문);
names.skipWhile((name) => 조건문);
names.any((name) => 조건문);
names.every((name) => 조건문);
//--- Sets (Set)
Set ages = { 1, 2, 3 };
final aSetOfInts = {};
ages.add(~);
ages.addAll(~);
ages.length;
//--- Maps (Map)
Map user = {
'id': 1,
'name': '홍길동'
}
final aMapOfIntToDouble = {};
user['id']
user.id
//--- Symbols (Symbol)
var aaa = Symbol('~');
#~
//--- Enums
//--- enum ~ = { ~, ~ }; ~.~
//--- Object
enum PlanetType { terrestrial, gas, ice }
PlanetType.gas
PlanetType.gas.name
//--- Iterable
Iterable iterable = const [1, 2, 3];
for (final element in iterable) {
print(element);
}
Iterable naturalsTo(int n) sync* {
int k = 0;
while (k < n) {
yield k++;
}
}
Iterable naturalsDownFrom(int n) sync* {
if (n > 0) {
yield n;
yield* naturalsDownFrom(n - 1);
}
}
Stream asynchronousNaturalsTo(int n) async* {
int k = 0;
while (k < n) {
yield k++;
}
}
//----------------------------------------------------------
//--- 타입
//----------------------------------------------------------
inst as MyClass //--- Type 변환
if (inst is MyClass) {
}
if (inst is! MyClass) {
}
typedef VarTypedef = List;
typedef Compare = int Function(T a, T b);
VarTypedef aa = [1, 2, 3];
//----------------------------------------------------------
//--- Metadata
//----------------------------------------------------------
@override
@deprecated('~를 대신 사용 하세요.')
class Todo {
final String who;
final String what;
const Todo(this.who, this.what);
}
@Todo('Dash', 'Implement this function')
class
//----------------------------------------------------------
//--- 클래스
//----------------------------------------------------------
abstract class AbstractClass {
void aaa();
}
class ParentClass {
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: '
'${invocation.memberName}');
}
}
mixin UseClass on ParentClass {
}
//--- ParentClass : 상속하는 클래스
//--- UseClass : 재사용할 클래스 (상속 아님)
class ~ extends ParentClass //--- super에 해당
implements AbstractClass
with UseClass async {
final String name; //--- this.name
final int age;
//--- 생성자
Queue(String name, int age) {
this.name = name;
this.age = age;
}
Queue(this.name, this.age);
Queue({ required this.name, required this.age });
Queue.hybrid(String make, String model) : this(make, model, 60);
Queue.hybrid(super.make, this.model) : super(make, 60);
Queue(this.name, this.age) { //--- 생성자
super();
}
Queue(String name) : super(name) {
super.name = name;
}
Queue(this.var001 = 1); //--- 생성자
Queue({ this.var001 }); //--- 생성자, 선택적 매개변수
Queue.unlaunched(String name) : this(name, null);
String call(String a, String b, String c) {
//--- varObj(~, ~, ~) 형태로 호출 한다.
}
//--- Factory 생성자
factory Shape.fromTypeName(String typeName) {
if (typeName == 'square') return Square();
if (typeName == 'circle') return Circle();
throw ArgumentError('Unrecognized $typeName');
}
final String var002 = 'aa'; //--- 값 변경 불가
const String var003 = 'bb'; //--- 상수
static const String _aaa = '';
DateTime? ~;
//--- Getters and Setters
int? get year => year.yyyy;
String get aaa => aaa;
int get year {
return 2022;
}
set aaa(newValue) => this._aaa = newValue;
@override
String myfunc(String aa, {int bb = 80}, [int cc = 1]) {
}
}
varClass Queue = Queue(5);
varClass Queue = Queue(var001: 5); //--- 선택적 매개변수 사용
varObj.var001
print(varObj.runtimeType)
class Foo {
T first(List ts) {
T tmp = ts[0];
return tmp;
}
}
var extenderFoo = Foo();
//----------------------------------------------------------
//--- 함수
//----------------------------------------------------------
//--- 최상위 레벨의 함수
void main(List arguments) async {
}
void funcName(int argInt = 11, required String? argStr = '') {
}
//--- Optional parameter
int sumUpToFive(int a, [int? b, int? c, int? d, int? e]) {
}
//--- Named parameter
void printName(String firstName, String lastName, {String? middleName}) {
print('$firstName ${middleName ?? ''} $lastName');
}
printName('John', 'Smith', middleName: 'Who');
//--- Anonymous functions (익명 함수)
() {
}
() => ''; //--- 람다식
obj.where((param) => param).forEach(print);
//--- Async functions
Future lookUpVersion() async => '1.0.0';
await lookUpVersion();
제어
if ((~) && (~)) {
} else if ((~) || (!~)) {
} else {
}
switch ('aaa') {
case 'a': break;
default: break;
}
(true) ? 'true':'false';
value = value ?? 12; //--- value가 null이면 12 할당
obj01?.obj02?.value //--- null이 아닌 경우에만 실행
for (final item in obj) {
}
for (final item in myArray) {
}
for (int idx = 0; idx < 10; idx++) {
}
await for (final request in requestServer) {
}
while (~) {
}
do {
} while (~);
try {
throw IOException('~');
} on IOException {
} on Exception catch(e, s) {
print('Exception: $e');
print('Stack trace: $s');
} catch(e, s) {
rethrow;
} finally {
}
obj..method001() //--- 차례로 실행
..method002();
obj..aaa = '~'
..bbb = '~';
입출력
//----------------------------------------------------------
//--- 정보 확인
//----------------------------------------------------------
version = await lookUpVersion();
var entrypoint = await findEntryPoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);
//----------------------------------------------------------
//--- 표준 입출력
//----------------------------------------------------------
print('~');
stdout.write('~'); //--- 표준 출력
String line = stdin.readLineSync(); //--- 표준 입력
//----------------------------------------------------------
//--- 파일 입출력
//----------------------------------------------------------
File finp = File('version.json');
List lines = finp.readAsLinesSync();
for (String line in lines) {
print(line);
stdout.writeln(line);
}
File fout = File('version.json');
fout.createSync(); //--- 파일 생성
String contents = '~';
fout.writeAsStringSync(contents);
main
void main() {
}
최종 수정일: 2022-12-05 20:43:39
이전글 :
다음글 :