• [์–ธ์–ด] Dart ๋ฌธ๋ฒ• ์ •๋ฆฌ

    2021. 1. 27.

    by. ํ•ด๋Š”์„ 

    ๋‚ด๊ฐ€ ๋ณด๊ณ  ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ์ •๋ฆฌํ•˜๋Š” Dart๋ฌธ๋ฒ•!

     

    dart ๋ฌธ๋ฒ• ๋งค๋‰ด์–ผ๊ณผ flutter ์ƒ์กด ์ฝ”๋”ฉ ๊ณต๋ถ€ ์ฑ…์„ ๋ณด๋ฉด์„œ ์ •๋ฆฌ.

    dart.dev/guides/language/language-tour

     

    A tour of the Dart language

    A tour of all of the major Dart language features.

    dart.dev

     

    ์‹ค์Šต ๊ฐ€๋Šฅํ•œ ์›น IDE ํ™˜๊ฒฝ : dartpad.dev/

     

    DartPad

     

    dartpad.dev

     

    ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

    (ํ‹ฐ์Šคํ† ๋ฆฌ ์ฝ”๋“œ๋ธ”๋Ÿญ์€ Dart๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ ์šฐ์„  java๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค)

     

    ์ฃผ์„

    //์ฃผ์„
    
    /**
    * ์ฃผ์„
    **/
    
    /// ๋ฌธ์„œ์ฃผ์„

     

    ๋ฌธ์žฅ

    ๋ช…๋ น ๋‹จ์œ„. ์„ธ๋ฏธ์ฝœ๋ก  ;์œผ๋กœ ๋๋‚œ๋‹ค.

     

    ๋ณ€์ˆ˜

    data๋ฅผ ๋‹ด๋Š” ์ƒ์ž. ์ข…๋ฅ˜๋Š” type, ์ž๋ฃŒํ˜•์ด๋ผ๊ณ  ํ•จ.dart๋Š” int, double, String, bool์„ ๊ธฐ๋ณธ ์ œ๊ณต.์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ.

    String name;
    name = "ํ™๊ธธ๋™";
    name = 'ํ™๊ธธ๋™';
    //๋”ฐ์˜ดํ‘œ ์ข…๋ฅ˜ ์ƒ๊ด€์—†์ด ๊ฐ€๋Šฅ

    int, double์€ num type์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ด๋ผ int, double ๋Œ€์‹  num์œผ๋กœ ์„ ์–ธ ๊ฐ€๋Šฅ.

    num ํƒ€์ž…์—๋Š” int, double ๋Œ€์ž… ๊ฐ€๋Šฅ.

    int a = 1;
    double b = 2.0;
    
    num c = a;
    c = b;

     

    ํƒ€์ž… ์ถ”๋ก 

    ์œ„์™€ ๊ฐ™์ด type์„ ์ง์ ‘ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ , var๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ. (JS๊ฐ™์ด)

    ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ.

    var i = 10; //int
    var d = 10.0 //double
    var s = "hello"; //String
    var b = true; //boolean
    

     

    ์ƒ์ˆ˜ final, const

    ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ์ƒ์ˆ˜ ์‚ฌ์šฉ. ์„ ์–ธ์‹œ final์„ ์ œ์ผ ์•ž์— ๋ถ™์ด๋ฉด ๊ฐ’์ด ์ˆ˜์ •๋˜์ง€ ์•Š์Œ. ํƒ€์ž… ์ƒ๋žต ๊ฐ€๋Šฅ.

    final String name = "ํ™๊ธธ๋™";
    final name = "ํ™๊ธธ๋™";

     

    ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž

    +, -, *, /(๋‚˜๋ˆ„๊ธฐ - double), ~/(๋ชซ - int), %(๋‚˜๋จธ์ง€ - int) ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

    +์˜ ๊ฒฝ์šฐ string concat์—์„œ๋„ ์‚ฌ์šฉ.

     

    ์ฆ๊ฐ ์—ฐ์‚ฐ์ž

    1์”ฉ ์ฆ๊ฐ€(++) ๋˜๋Š” 1์”ฉ ๊ฐ์†Œ(--). ํ›„์œ„(์‹++)/์ „์œ„(++์‹) ์—ฐ์‚ฐ ๋ชจ๋‘ ๊ฐ€๋Šฅ.

     

    ๋น„๊ต ์—ฐ์‚ฐ์ž

    ==, !=, >, <, >=, <= ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

     

    ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž

    boolean ํƒ€์ž…์œผ๋กœ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜.

    &&, ||, ==, !, != ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

     

    ํƒ€์ž… ๊ฒ€์‚ฌ

    is๋ฅผ ์‚ฌ์šฉ. 

    [๋ณ€์ˆ˜] is [type] => ๊ฐ™์€ ํƒ€์ž…์ธ์ง€[๋ณ€์ˆ˜] is! [type] => ๋‹ค๋ฅธ ํƒ€์ž…์ธ์ง€

    int a = 1;
    
    if (a is int){~}
    if (a is! int){~}

     

    ํ˜•๋ณ€ํ™˜ (as)

    type casting. as๋ฅผ ์‚ฌ์šฉ. ๋‹ค๋ฅธ ํƒ€์ž…๋ผ๋ฆฌ๋Š” ๋ณ€ํ™˜ ๋ถˆ๊ฐ€. ์ƒ์œ„ ๊ฐœ๋…์œผ๋กœ๋งŒ ๋ณ€ํ™˜ ๊ฐ€๋Šฅ.

    ํŠนํžˆ, int, double์€ num์œผ๋กœ ๋ฌถ์—ฌ์žˆ์ง€๋งŒ ๊ฐ์ž๋Š” ๊ด€๊ณ„๊ฐ€ ์—†์–ด ํ˜•๋ณ€ํ™” ๋ถˆ๊ฐ€.

    var c = 10.0
    num n = c as num;
    num n = c //as num ์ƒ๋žต ๊ฐ€๋Šฅ
    int d = c as int; //errpr

     

     

    ํ•จ์ˆ˜

    function. ์ฝ”๋“œ ๋ฌถ์Œ ๋‹จ์œ„.

     

    ํ•จ์ˆ˜ ํ˜•ํƒœ

    ์ž…๋ ฅ ๋ฐ›๋Š” ๋ฌธ์ž : ๋งค๊ฐœ๋ณ€์ˆ˜ parameter์‹ค์ œ๋กœ ์ž…๋ ฅ๋ฐ›๋Š” ๊ฐ’ : ์ธ์ˆ˜ argument๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’ : ๋ฐ˜ํ™˜๊ฐ’ Return

    => ์ผ๋ฐ˜์ ์ธ C๋ฌธ๋ฒ•๊ณผ ๋™์ผํ•˜๋‹ค.

     

    ๋ณ€์ˆ˜ ์•ž์— $๋ฅผ ๋ถ™์—ฌ ๋ฌธ์ž์—ด ๋‚ด์— ๋ณ€์ˆ˜ ์‚ฝ์ž… ๊ฐ€๋Šฅ. (ํŒŒ์ด์ฌ์—์„œ {}์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค)

    ๋˜ํ•œ, ${~~}๋ถ€๋ถ„์— ํ‘œํ˜„์‹ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

    String name = "์ด์ˆœ์‹ ";
    int age = 20;
    
    void main(){
    	print('$name์€ $age์‚ด ์ž…๋‹ˆ๋‹ค.');
        print("$name์€ ${name.length}๊ธ€์ž ์ž…๋‹ˆ๋‹ค.");
    }

     

    ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ

    ์ตœ์ƒ์œ„ ํ•จ์ˆ˜ : class ๋ฐ–์— ์ž‘์„ฑํ•˜๋Š” ํ•จ์ˆ˜. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•˜๋Š” ํ•จ์ˆ˜๋“ค. (main method์ฒ˜๋Ÿผ ๊ฐ€์žฅ ๋ฐ–์— ์ž‘์„ฑ). ์–ด๋””์—์„œ๋‚˜ ํ˜ธ์ถœ ๊ฐ€๋Šฅ.

    method : class ๋‚ด๋ถ€์— ์ž‘์„ฑํ•˜๋Š” ํ•จ์ˆ˜. ์ •์˜๋œ class์— ๊ด€๊ณ„๋œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰. Static์ด ๋ถ™์€ method๋Š” ์ •์  ๋ฉ”์„œ๋“œ๊ฐ€ ๋˜์–ด ์ตœ์ƒ์œ„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

     

    ์ต๋ช… ํ•จ์ˆ˜

    anonymouse function. 

    ([์ธ์ˆ˜๋ช…]) { [๋™์ž‘ or Return ๊ฐ’] }

    (number) {
    	return number % 2 == 0;
    };

     

    ๋žŒ๋‹ค์‹

    ([์ธ์ˆ˜๋ช…]) => [๋™์ž‘ or Return ๊ฐ’]

    (number) => number%2 == 0;

     

    ์„ ํƒ ๋งค๊ฐœ๋ณ€์ˆ˜

    ์ •์˜์—์„œ {}๋กœ ๊ฐ์‹ผ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. Named parameter.

    void f(String name, {int age}) {}

    {}๋กœ ๊ฐ์‹ธ์ง€ ์•Š์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ๋„˜๊ฒจ์ฃผ์–ด์•ผ ํ•˜๊ณ , {}๋กœ ๊ฐ์‹ผ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ age : 5๋กœ ๋„˜๊ฒจ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

    ์„ ํƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    void f(String name, {int age = 5}) {}

     

     

    ๋ถ„๊ธฐ์™€ ๋ฐ˜๋ณต

    if else

    int a = 10;
    
    if (a % 2 == 0) {~}
    else if (a % 3 == 0) {~}
    else {~}

     

    ์‚ผํ•ญ ์—ฐ์‚ฐ

    [์กฐ๊ฑด] ? [์ฐธ์ผ ๋•Œ] : [๊ฑฐ์ง“์ผ ๋•Œ]

    var number = a%2 ? a++ : a--

     

    switch case

    ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ ์œ ์šฉ. enum๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋• ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋Š” ๊ฐ•์ œ์„ฑ์ด ์ƒ๊น€.

    Switch - case - break๋กœ ๋ฌธ๋ฒ•์€ C์™€ ๋™์ผ

     

    for

    ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต.

    for (var i = 0; i < 10 ; i++){
    	print(i);
    }

     

     

     

    ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

    dart๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด!

     

    ํด๋ž˜์Šค

    ๊ฐ์ฒด object : ์ €์žฅ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜์–ด ๊ฐ’์„ ๊ฐ€์ง€๊ฑฐ๋‚˜ ์‹๋ณ„์ž์— ์˜ํ•ด ์ฐธ์กฐ๋˜๋Š” ๊ณต๊ฐ„. (๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๋ฉ”์„œ๋“œ)

    ์ธ์Šคํ„ด์Šค instance : ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ.

    ํด๋ž˜์Šค class : ์ธ์Šคํ„ด์Šค์˜ ์„ค๊ณ„๋„. 

    ์†์„ฑ property : ํด๋ž˜์Šค ์•ˆ์— ํ‘œํ˜„๋˜๋Š” ์†์„ฑ.

     

    ํด๋ž˜์Šค๋Š” ์ผ์ข…์˜ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…!

    class Person{
    	String name;
        int age;
    }
    
    var person = new Person();
    var person2 = Person(); //new ์ƒ๋žต ๊ฐ€๋Šฅ

    ๋ณ€์ˆ˜๋ช… ๋’ค์— . ์—ฐ์‚ฐ์ž๋ฅผ ์ž…๋ ฅ, ๊ฐ์ฒด์˜ property์— ์ ‘๊ทผ ๊ฐ€๋Šฅ.

    print(person.name);
    print(person.age);

    ๋ฉ”์„œ๋“œ : ํด๋ž˜์Šค ์•ˆ์— ์ž‘์„ฑํ•˜๋Š” ํ•จ์ˆ˜. ๋ฉ”์„œ๋“œ๋Š” class์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋“ฑ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ. ์ด ์—ญ์‹œ .์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์—ฌ ์ ‘๊ทผ ๊ฐ€๋Šฅ.

     

    ์ ‘๊ทผ ์ง€์ •์ž

    java์—์„œ์˜ public, private์™€ ๊ฐ™์€ ์—ญํ• . ์—ฌ๊ธฐ์„œ๋Š” _ ์„ ๋ถ™์—ฌ ๊ตฌ๋ถ„ํ•œ๋‹ค. (๋ถ™์ด๋ฉด private)

    class Person{
    	String name;
        int _age;
        
        void addOneYear(){
        	_age++;
        }
    }
    
    //=====๋‹ค๋ฅธ Dart file
    import 'person.dart';
    
    void main(){
    	var person = Person();
        person._age = 10; //error!
    }

    ์ด๋•Œ, private์˜ ์˜์—ญ์€ ์ •์˜๋œ ํŒŒ์ผ ๋‚ด! ์ฆ‰, _์ด ๋ถ™์–ด ์žˆ์–ด๋„ ๊ฐ™์€ ํŒŒ์ผ ๋‚ด๋ผ๋ฉด class์˜ ๋ฐ–์— ์žˆ์–ด๋„ ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

     

    ์ƒ์„ฑ์ž

    ์ธ์Šคํ„ด์Šคํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ์ผ์ข…์˜ ๋ฉ”์„œ๋“œ. ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์ƒ์„ฑ๋จ. ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ํด๋ž˜์Šค๋ช…๊ณผ ๊ฐ™๋‹ค.

    class Person{
    	String name;
        int _age;
        
        Person({this.name, this._age}); //constructor
    }
    
    var person = Person();
    var person2 = Person(name : 'ํ™๊ธธ๋™', _age : 20);

     

     

    getter, setter

    _์„ ๋ถ™์ธ private ๋ณ€์ˆ˜์— ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ†ต๋กœ๊ฐ™์€ ๋ฉ”์„œ๋“œ.

    //person.dart
    
    class Person{
    	String name;
        int _age = 10;
        
        int get age => _age; //getter
        set setAge(num value) => _age = value; //setter
    }
    
    //main.dart
    
    void main(){
    	var person = Person();
        print(person.age); //10
        person.setAge = 5;
        print(person.age); //5
    }

     

    ์ƒ์†

    implement. ์ฃผ๋Š” ์ชฝ์ด super class (๋ถ€๋ชจ), ๋ฐ›๋Š” ์ชฝ์ด sub class(์ž์‹)

    //๋ถ€๋ชจ class
    class Hero{
    	String name = 'hero';
        
        void run() {}
    }
    
    //์œ„๋ฅผ ์ƒ์†๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค
    class SuperHero extend Hero{
    	@override //์žฌ์ •์˜
        void run(){
        	super.run(); //๋ถ€๋ชจ์˜ run์‹คํ–‰
            this.fly(); //์ถ”๊ฐ€๋กœ ์ž์‹์ด ๋”ฐ๋กœ ์ •์˜ํ•œ fly๋„ ์‹คํ–‰.
        }
        
        void fly() {}
    }
    
    
    void main(){
    	var hero = SuperHero();
        hero.run();
        hero.fly();
        print(hero.name); //hero ์ถœ๋ ฅ
    }

     

    ์ถ”์ƒ ํด๋ž˜์Šค

    abstract class. ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค.

    ์ถ”์ƒ ๋ฉ”์„œ๋“œ : ์„ ์–ธ๋งŒ๋˜๊ณ  ์ •์˜๊ฐ€ ์—†๋Š” ๋ฉ”์„œ๋“œ.

    ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ implementํ•ด์„œ ์™„์„ฑํ•˜๋Š” ์ƒ์† ์žฌ๋ฃŒ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. (ํ‹€๊ฐ™์€ ๋Š๋‚Œ? ํ…œํ”Œ๋ฆฟ?)

    ์ด๋•Œ ๋Œ€์ƒ ํด๋ž˜์Šค์—๋Š” implements, ๋ฉ”์„œ๋“œ์—๋Š” @override ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ(

    ์—ฌ๋Ÿฌ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ํ•œ๋ฒˆ์— implementํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•ด์•ผ ํ•œ๋‹ค.

    abstract class Monster{
    	void attack();
    }
    
    abstract class Flyable{
    	void fly();
    }
    
    class Bat implements Monster, Flyable(
    	@override
        void attack(){
        	print('ํ• ํ€ด๊ธฐ!');
        }
        
        @override
        void fly(){
        	print('ํŽ„๋ŸญํŽ„๋Ÿญ');
        }
    }

     

    ๋ฏน์Šค์ธ

    mixin. with๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์†ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํด๋ž˜์Šค ๊ธฐ๋Šฅ overwritte๊ฐ€๋Šฅ. 

    class Goblin implements Monster{
    	@override
        void attack(){
        	print('๊ณ ๋ธ”๋ฆฐ ๊ณต๊ฒฉ');
        }
    }
    
    class DarkGoblin extends Goblin with Hero{
    
    } //๋‹คํฌ ๊ณ ๋ธ”๋ฆฐ์€ ๊ณ ๋ธ”๋ฆฐ์ด๊ธฐ๋„ ํ•˜๋ฉฐ, ํžˆ์–ด๋กœ์ด๊ธฐ๋„ ํ•˜๋ฉฐ, ๋ชฌ์Šคํ„ฐ์ด๊ธฐ๋„ ํ•จ. => ๋‹คํ˜•์„ฑ!

     

    ์—ด๊ฑฐํ˜•

    enum type. ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ์˜ ํด๋ž˜์Šค. ์ƒ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    enum Status { login, logout }
    
    var authStatus = Status.logout;
    
    switch(authStatus){
    	case Status.login:
        	print('login');
            break;
        case Status.logout:
        	print('logout');
            break;
    }

     

     

    ์ปฌ๋ ‰์…˜

    list, map, set๋“ฑ์˜ collection์„ ๊ธฐ๋ณธ ์ œ๊ณตํ•จ.

     

    List

    ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ž๋ฃŒ๋ฅผ ๋‹ด์Œ. Dart๋Š” ๋ฐฐ์—ด (Array)๋ฅผ ๋ณ„๋„๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

    List<String> items = ['a', 'b', 'c'];
    var items = ['a', 'b', 'c'];
    
    items[0] = 'd'; //0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” index.
    
    print(items.length); //3
    โ€ป dynamic
    ๋ชจ๋“  ํƒ€์ž…์„ ๋Œ€๋ณ€ํ•˜๋Š” ํŠน์ˆ˜ ํƒ€์ž…! ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ํ•œ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ฑฐ๋‚˜ ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

    List<dynamic> list = [1, 2, 'a'];
    var list = [1, 2, 'a'];

     

    ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž

    spread. '...' ์—ฐ์‚ฐ์ž. ์ปฌ๋ ‰์…˜์„ ํŽผ์ณ์ค€๋‹ค. ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์•ˆ์— ์ปฌ๋ ‰์…˜์„ ์‚ฝ์ž…ํ•  ๋•Œ ์‚ฌ์šฉ.

    var items = ['a', 'b', 'c'];
    
    var items2 = ['d', ...items, 'e']; //d, a, b, c, e

     

    Map

    ์ˆœ์„œ ์—†์Œ. ํƒ์ƒ‰ ๋น ๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ. key-value์˜ ์Œ.

    //Map<String, String> cityMap = {...} ๊ณผ ๊ฐ™์Œ.
    var cityMap = {
    	'korea': 'busan',
        'japan': 'tokyo',
        'china': 'Beijing'
    };
    
    cityMap['korea'] = 'seoul';
    
    print(cityMap.length); //3
    
    cityMap['America'] = 'Washington'; //์ƒˆ ๊ฐ’ ์ถ”๊ฐ€

     

    Set

    ์ง‘ํ•ฉ ํ‘œํ˜„. => ์ค‘๋ณต ๋ถˆํ—ˆ์šฉ

    add(), remove()๋กœ ์ถ”๊ฐ€/์‚ญ์ œ ๊ฐ€๋Šฅ.

    contains() : ์ฐพ๋Š” ์ž๋ฃŒ๊ฐ€ ์ง‘ํ•ฉ์— ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ bool๋กœ ๋ฐ˜ํ™˜.

    // Set<String> citySet = {}๊ณผ ๊ฐ™์Œ
    var citySet = {'์„œ์šธ', '๋ถ€์‚ฐ', '๊ด‘์ฃผ', '๋Œ€์ „', '์šธ์‚ฐ'}
    
    citySet.add('๋Œ€๊ตฌ');
    citySet.remove('์„œ์šธ');
    
    print(citySet.contatins('์šธ์‚ฐ'); // true

    ๋น„์–ด์žˆ๋Š” Set์ด๋‚˜ map์„ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์ฃผ์˜! ๊ทธ๋ƒฅ {}๋งŒ ์“ฐ๋ฉด Map์œผ๋กœ ์ธ์‹ํ•ด๋ฒ„๋ฆผ.

    var mySet = <String>{}; //set์œผ๋กœ ์ธ์‹
    var mySet2 = {}; //dynamic, dynamic์ธ map์œผ๋กœ ์ธ์‹

     

     

    ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

    Dart๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์ง•์„ ๋ชจ๋‘ ์ œ๊ณต (๋ญ์ง€....)

    ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ : ์ž๋ฃŒ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ•™์  ํ•˜์ˆ˜์˜ ๊ณ„์‚ฐ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ํŒจ๋Ÿฌ๋‹ค์ž„. (์ƒํƒœ์™€ ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ X)

     

    ์ผ๊ธ‰ ๊ฐ์ฒด

    ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰. ์ฆ‰, ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ์Œ.

    void greeting(String text){
    	print(text);
    }
    
    void main(){ // ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ์Œ
    	var f = greeting;
        f('hello');
    }

    ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Œ.

    ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ, ์ˆ˜์ •, ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ '์ผ๊ธ‰ ๊ฐ์ฒด', first-class object๋ผ๊ณ  ํ•จ.

     

    for๋ฌธ๊ณผ forEach()ํ•จ์ˆ˜

    for : ์™ธ๋ถ€ ๋ฐ˜๋ณต

    forEach() : ๋‚ด๋ถ€๋ฐ˜๋ณต =>(E element) {} ํ˜•ํƒœ์˜ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์Œ.

    items.forEach(print); // 1, 2, 3, 4, 5
    
    items.forEach((e) {
    	print(e);
    });
    
    itmes.forEach((e) => print(e));
    
    items.forEach(print);

     

    where

    ์กฐ๊ฑด์„ ํ•„ํ„ฐ๋ง ํ•  ๋•Œ ์‚ฌ์šฉ. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฉ”์„œ๋“œ ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

    items.where((e) => e % 2 == 0).forEach(print); //2, 4

     

    map

    ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ’์„ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต.

    items.where((e) => e % 2 == 0).map((e) => '์ˆซ์ž $e').forEach(print);

     

    toList

    ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜ ๋Œ€๋ถ€๋ถ„์€ Iterable<T> ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜.

    ํ•˜์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋Œ€๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ. => ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ”๊ฟ”์•ผํ•จ.

    final result = itmes.where((e) => e % 2 == 0).toList();

     

    toSet

    ๋ฆฌ์ŠคํŠธ์— ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์–ป๊ณ  ์‹ถ์„ ๋•Œ ์ง‘ํ•ฉ์ธ set์„ ์‚ฌ์šฉ.

    final result = itmes.where((e) => e % 2 == 0).toSet().toList();

     

    any

    ๋ฆฌ์ŠคํŠธ์— ํŠน์ • ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜.

    print(items.any((e) => e % 2 == 0));

     

    reduce

    ๋ฐ˜๋ณต ์š”์†Œ๋ฅผ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜.

    // ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•  ๋•Œ, ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๊ตํ•˜๋Š” ๋กœ์ง
    
    final result = items.reduce(max); //5

     

     

    ๊ธฐํƒ€

    ๊ณ„๋‹จ์‹ ํ‘œ๊ธฐ๋ฒ• .. ์—ฐ์‚ฐ์ž

    cascade notation .. ์—ฐ์‚ฐ์ž. ๋™์ผ ๊ฐ์ฒด์—์„œ ์ผ๋ จ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ.

    .. ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜.

    print(items
    	..add(6)
        ..remove(2)); //1, 3, 4, 5, 6

     

    ์ปฌ๋ ‰์…˜ if

    ์กฐ๊ฑด์— ์˜ํ•ด ์ปฌ๋ ‰์…˜์˜ ๊ฐ’์„ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ.

    bool promoActive = true;
    
    print([1, 2, 3, 4, 5, if (promoActive) 6]); // true์ผ ๋•Œ๋งŒ 6์ด ์ถ”๊ฐ€๋จ

     

    ์ปฌ๋ ‰์…˜ for

    ์ปฌ๋ ‰์…˜ ๋ฌธ๋ฒ• ์•ˆ์—์„œ for ๋ฌธ์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

    var listOfInts = [1, 2, 3];
    var listOfStrings = [
    	'#0',
        for (var i in listOfInts) '#$i'
    ]; 
    //#0, #1, #2, #3
    

     

    null ์ฒ˜๋ฆฌ

    ๋‹คํŠธ๋Š” null์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต. (Dart์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด. int, double, bool ๊ฐ™์€ ํƒ€์ž…๋“ค๋„ ๋ชจ๋‘ ๊ฐ์ฒด๋ผ null๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Œ.)

    ?. ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด null ์—ฌ๋ถ€ ํŒŒ์•… ๊ฐ€๋Šฅ.

    print(name?.lentgh); //null์ถœ๋ ฅ

     

    ??์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด๊ฐ€ null์ผ ๋•Œ ์ž‘๋™์„ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ.

    print(name?.length ?? 0); //name์ด null์ด๋ฉด 0์„ ์ถœ๋ ฅ

    ๋Œ“๊ธ€