๐Ÿ“šSTUDY/๐ŸŽซDart&Flutter

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

ํ•ด๋Š”์„  2021. 1. 27. 22:54

๋‚ด๊ฐ€ ๋ณด๊ณ  ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ์ •๋ฆฌํ•˜๋Š” 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์„ ์ถœ๋ ฅ