상단

Dart 2.12


 
 

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() {
}
최종 수정일: 2024-09-30 12:26:19

이전글 :
다음글 :