[Dart] ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ ๋คํธ ํ์ต - Part 1
Dart์ JavaScript๋ ๋ง์ ๊ฐ๋ ์ ๊ณต์ ํ๋ค. Dart ์ญ์ ์ด๋ฒคํธ ๋ฃจํ์์ ์คํ๋๊ณ , ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํ Future๋ผ๋ ๊ฐ๋ ์ด ์กด์ฌํ๋ค. Future๋ ์๋ฐ์คํฌ๋ฆฝํธ์ Promise์ ๋น์ทํ๋ค. Dart๋ ์ ์ ํ์ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝํ์ด ์๋ค๋ฉด Dart๋ฅผ ๋ ์ฝ๊ฒ ๋ฐฐ์ธ ์ ์๋ค.
Dart์ JavaScript์ ๋ค๋ฅธ ์ ๊ณผ ๋น์ทํ ์ ์ Learning Dart as a JavaScript developer ํ์ด์ง์ ์์ธํ ์ค๋ช ๋ผ ์์ด์ ์ ๋ฆฌํด๋ดค๋ค.
Conventions and linting
- Dart ํ์์ ๊ณต์์ ์ผ๋ก ์ฝ๋ ์คํ์ผ ๊ฐ์ด๋์ Lint ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ค.
- dart fix๋ฅผ ํตํด ์ฝ๋ ์ด์๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์์ ํ ์ ์๋ค.
- dart format์ ํตํด ์ฝ๋๋ฅผ ํฌ๋งคํ ํ ์ ์๋ค
Built-in types
- Dart๋ ์ ์ ํ์ ์์คํ ์ ์ฌ์ฉํ์ฌ ๋ณ์์ ํํ์ ํ์ ์ ์ปดํ์ผ ์์ ์ ๊ฒฐ์ ํ๋ค.
- Dart์ ๋นํธ์ธ ํ์
:
- Numbers (
num
,int
,double
) - Strings (
String
) - Booleans (
bool
) - Lists (
List
) — ๋ฐฐ์ด - Sets (
Set
) — ์ค๋ณต๋์ง ์๋ ์ ์ผํ ์์๋ค์ ์งํฉ(์์ ๋ณด์ฅ ์ํจ) - Maps (
Map
) — ํค-๊ฐ ์์ ์ ์ฅํ๋ ์ปฌ๋ ์ (๊ฐ์ฒด์ ๋น์ท) - Symbols (
Symbol
) - null (
Null
)
- Numbers (
- Dart์์ ์์ ํ์ ์ด ์๋ค. ๋ชจ๋ ๊ฐ์ ๊ฐ์ฒด๋ค.
- number, boolean, null ํ์ ์ ์ ๊ทํ ๊ณผ์ ์ ํตํด ๋ฉ๋ชจ๋ฆฌ ์์ ์ค์ง ํ๋์ ๊ฐ์ฒด๋ก๋ง ์กด์ฌํ๋ค. ์๋ฅผ๋ค์ด ์ซ์ 1์ ๋ค๋ฅธ ๋ณ์์์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ค์ง ํ๋์ int ๊ฐ์ฒด๋ก๋ง ์ ์ฅ๋๋ค.
==
์ฐ์ฐ์๋ ๋ ผ๋ฆฌ์ ๋๋ฑ์ฑ(๊ฐ์ ๊ฐ์ ๊ฐ์ง๋์ง)์ ๋น๊ตํ๊ณ ,identical()
ํจ์๋ ์ฐธ์กฐ ๋๋ฑ์ฑ(๊ฐ์ ์ธ์คํด์ค์ธ์ง)์ ๋น๊ตํ๋ค.
Numbers
Dart๋ ์ซ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ 3๊ฐ์ง ๋ฐ์ดํฐ ์ ํ์ด ์๋ค
- int : ์์๋ถ๊ฐ ์๋ ์ซ์(์ ์)
- double : 64๋นํธ(๋ฐฐ์ ๋ฐ๋) ๋ถ๋ ์์์ ์ซ์(์ค์)
- num : int์ double์ ์์ ํ์ . ์๋ฐ์คํฌ๋ฆฝํธ์ number ํ์ ๊ณผ ๋์ผ
Dart๋ ์ซ์๋ ๊ฐ์ฒด๋ก ๊ฐ์ฃผํ๋ฏ๋ก, ์ซ์์์ ๋ฐ๋ก ๊ด๋ จ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
// JS
const rounded = math.round(2.5);
// Dart
var rounded = 2.5.round();
String
๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์์ฑํ๋ ค๋ฉด ๋ฐ์ดํ '
ํน์ ์๋ฐ์ดํ "
๋ฅผ ์ฌ์ฉํ๋ค. ํน์ ๋ฌธ์ ์ด์ค์ผ์ดํ๋ ๋ฐฑ์ฌ๋์ \
๋ฅผ ์ฌ์ฉํ๋ค.
final singleQuotes = 'I\'m learning Dart'; // I'm learning Dart
final doubleQuotes = "Escaping the \" character"; // Escaping the " character
final dollarEscape = 'The price is \$3.14.'; // The price is $3.14.
final backslashEscape = 'The Dart string escape character is \\.';
final unicode = '\u{1F60E}'; // ๐, Unicode scalar U+1F60E
๋ฌธ์์ด์ ํํ์์ ์ฌ์ฉํ ๋ ${ํํ์}
ํํ๋ก ์ฌ์ฉํ๋ค. ๋จ์ผ ์๋ณ์์ผ ๋ ์ค๊ดํธ๋ฅผ ์๋ตํ ์ ์๋ค.
int a = 5;
int b = 3;
var str = 'The sum of $a and $b is ${a + b}.'
Dart์์ ๋ฌธ์์ด์ด ์ฌ๋ฌ ์ค์ ๊ฑธ์ณ ์๋ ๊ฒฝ์ฐ ์ธ์ ํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๋ชจ๋ ์ฐ๊ฒฐํ๋ค.
final s1 = 'String '
'concatenation'
" even works over line breaks.";
print(s1); // String concatenation even works over line breaks.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฒกํฑ(`)์ ์ด์ฉํด ์ฌ๋ฌ ์ค์ ๋ฌธ์์ด์ ์์ฑํ๋ ๊ฒ์ฒ๋ผ Dart์์ ๋ฐ์ดํ 3๊ฐ('''
ํน์ """
)๋ฅผ ์ฌ์ฉํ๋ค.
final s2 = '''
You can create
multiline strings like this one.
''';
Equality
Dart๋ ๋ ๋ฌธ์์ด์ด ๋์ผํ ์ฝ๋ ์ ๋ ์ํ์ค๋ฅผ ํฌํจํ๋ฉด ๊ฐ์ ๊ฐ์ผ๋ก ๊ฐ์ฃผํ๋ค. ๋ ๋ฌธ์์ด์ด ๋์ผํ ์ํ์ค์ธ์ง ํ์ธํ๋ ค๋ฉด equal-to ==
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
final s1 = 'Hello '
'World';
print(s1 == 'Hello World'); // true
Booleans
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋คํธ์ ๋ถ๋ฆฌ์ธ ๊ฐ์ ์ด์ง ์กฐ๊ฑด(์ฐธ/๊ฑฐ์ง)์ ํํํ๋ค. true
, false
๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๊ฑฐ๋ x < 5
๊ฐ์ ํํ์์ ์ฌ์ฉํด์ ๋ถ๋ฆฌ์ธ ๊ฐ์ ์์ฑํ ์ ์๋ค.
var isLoading = false;
Variables
Dart์ ๋ชจ๋ ๋ณ์๋ ํ์
์ด ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ let
, const
์ฒ๋ผ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค. ๋ณ์ ํ์
์ ์ง์ ์ ์ํ๊ฑฐ๋, Dart ๋ถ์๊ธฐ๊ฐ ํ์
์ ์ถ๋ก ํ๋๋ก ํ ์๋ ์๋ค.
// ๋ณ์ ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํํ๋ฉด Dart๊ฐ ํ์
์ ์ถ๋ก ํ๋ค
var name = 'bob';
// Error! ์ถ๋ก ํ ํ์
๋ง ๋ณ์์ ํ ๋นํ ์ ์๋ค
name = 5;
์ด๊ธฐ ๊ฐ์ ์ ๊ณตํ์ง ์๊ฑฐ๋ ํ์
์ ๋ณ๋๋ก ์ง์ ํ์ง ์์ผ๋ฉด ๋ชจ๋ ํ์
์ ํ์ฉํ๋ dynamic
์ผ๋ก ์ถ๋ก ๋๋ค. dynamic
์ catch-all ํ์
์ผ๋ก, TypeScript์ any
์ ๋น์ทํ๋ค๊ณ ๋ณผ ์ ์๋ค.
// dynamic type์ผ๋ก ์ถ๋ก
var name;
name = 'bob'; // OK
name = 5; // OK
Final and const โญ๏ธ
์๋ฐ์คํฌ๋ฆฝํธ์ Dart ๋ชจ๋ const
๋ฅผ ์ฌ์ฉํ์ง๋ง ์๋ ๋ฐฉ์์ด ์กฐ๊ธ ๋ค๋ฅด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ const
๋ Dart์์ final
ํค์๋์ ๋ ์ ์ฌํ๋ค. final
๋ก ์ ์ธ๋ ๋ณ์๋ ํ ๋ฒ ์ด๊ธฐ๋๋ฉด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ, ๋ณ์์ ๊ฐ์ ๋ฐํ์ ์์ ์ ๊ฒฐ์ ๋๋ค.
Dart์ const
๋ ์ปดํ์ผ ์์ ์ ์์ฑ๋๋ ๋ถ๋ณ ๊ฐ์ผ๋ก ์ฌ์ด๋ ์ดํํธ๊ฐ ์๋ ํน์ง์ด ์๋ค. ์ ๋ฆฌํ๋ฉด final
์ ๋ฐํ์ ์์ ์, const
๋ ์ปดํ์ผ ์์ ์ ๊ฒฐ์ ๋๋ ๋ถ๋ณ๊ฐ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์์ ๋ณ์(constant variables) : const
ํค์๋๋ฅผ ์ฌ์ฉํด์ ์ ์ธํ ๋ณ์. ์์ ๋ณ์๋ ๋ฐ๋์ ์์ ๊ฐ์ ํฌํจํด์ผ ํ๋ค. ์์ ๊ฐ์ด๋ ์ปดํ์ผ ์์ ์ ๊ฒฐ์ ๋๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ ์๋ฏธํ๋ค.
const int a = 10; // ๊ฐ์ด 10์ผ๋ก ๊ณ ์ ๋ ์์ ๋ณ์
๋น์์ ๋ณ์(non-constant variables) : final
๋๋ var
๋ก ์ ์ธํ ๋ณ์. ๋น์์ ๋ณ์๋ ์์ ๊ฐ์ ํฌํจํ ์ ์๋ค. ์์ ๊ฐ์ ํฌํจํ๋ ๊ฒฝ์ฐ์ const
ํค์๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๋ช
์ํ ์ ์๋ค.
final int b = 20; // ์์ ๊ฐ 20์ ํฌํจํ ๋น์์ ๋ณ์
var c = const [1, 2, 3]; // ์์ ๋ฆฌ์คํธ๋ฅผ ํฌํจํ ๋น์์ ๋ณ์
์๋ฐ์คํฌ๋ฆฝํธ์ const
๋ ๋ณ์์ ์ฌํ ๋น์ ๋ง์ง๋ง, ๊ฐ์ฒด ํ๋์ ์์ ์ ํ์ฉํ๋ค. ๋ฐ๋ฉด Dart์ const
๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์์ ํ ๋ถ๋ณ์ผ๋ก ๋ง๋ค์ด ์ฌํ ๋น์ ๋ฌผ๋ก ๊ฐ์ฒด ํ๋๋ ์์ ๋ ๊ธ์งํ๋ค.
Null safety
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ค๋ฅด๊ฒ Dart๋ null safety๋ฅผ ์ง์ํ๋ค. null safety๋ null ์ฐธ์กฐ๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ด๋ค. Dart์์ ๋ชจ๋ ๋ณ์์ ๊ฐ์ฒด๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก null์ ๊ฐ์ง ์ ์๋ค(non-nullable).
์ปดํ์ผ ํ์์(์ฝ๋ ์์ฑ ์์ ) null ์ฐธ์กฐ ์์ธ๋ฅผ ํฌ์ฐฉํ๊ธฐ ๋๋ฌธ์ ์๊ธฐ์น ์์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ๋ณ์๊ฐ null ๊ฐ์ ๊ฐ์ง ์ ์์์ ๋ํ๋ด๋ ค๋ฉด ํ์
์ ์ธ์ ?
๋ฅผ ์ถ๊ฐํ๋ค. Dart์์ ๋ณ์๋ฅผ ์ด๊ธฐํํ์ง ์์ผ๋ฉด(๊ฐ์ ํ ๋นํ์ง ์์ผ๋ฉด) null ๊ฐ์ ๊ฐ์ง๋ค(JS๋ undefined).
int? nullableInt; // int? nullableInt = null; ์ ๋์ผ
print(nullableInt); // null
Dart๋ null์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ null ํ ๋น ์ฐ์ฐ์ ??=
, null ๋ณํฉ ์ฐ์ฐ์ ??
, ์ต์
๋ ์ฒด์ด๋ ์ฐ์ฐ์ ?.
๋ฅผ ์ง์ํ๋ค. Nullable ๋ณ์๋ ํํ์์ด null์ด ์๋์ ๋จ์ธํ๊ธฐ ์ํด !
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ปดํ์ผ๋ฌ์ null ๊ฒ์ฌ ์ค๋ฅ๋ฅผ ์ต์ ํ ๋ ์ฌ์ฉํ๋ค.
int? a = 5;
// nullable ํ์
a๋ฅผ non-nullable ํ์
์ธ b์ ํ ๋น ํ ์ ์๋ค.
int b = a;
// ! ์ฐ์ฐ์๋ก a๋ฅผ non-nulalble ํ์
์ผ๋ก ๋ณํํ์ผ๋ฏ๋ก ํ ๋น ๊ฐ๋ฅ
int b = a!;
Functions
์ฝ๊ฐ์ ํจ์ ์ ์ธ ๋ฌธ๋ฒ ์ฐจ์ด๋ฅผ ์ ์ธํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ ๊ฑฐ์ ๋น์ทํ๊ฒ ์๋ํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฒ๋ผ ์ต์์ ๋ ๋ฒจ, ํด๋์ค ํ๋, ๋ก์ปฌ ์ค์ฝํ ๋ฑ ๊ฑฐ์ ๋ชจ๋ ๊ณณ์์ ํจ์๋ฅผ ์ ์ธํ ์ ์๋ค.
// ์ต์์ ๋ ๋ฒจ
int multiply(int a, int b) {
return a * b;
}
// ๋ก์ปฌ ์ค์ฝํ
void main() {
int multiply(int a, int b) {
return a * b;
}
print(multiply(3, 4));
}
Arrow syntax
Dart ์์๋ ํจ์์ ํ์ดํ =>
๊ตฌ๋ฌธ์ ์ง์ํ์ง๋ง, ๋จ์ผ ํํ์ ๋๋ ๋ฆฌํด๋ฌธ์ ํฌํจํ ๋๋ง ์ฌ์ฉํ ์ ์๋ค. ์๋ ๋ isNoble
ํจ์๋ ๋์ผํ๋ค.
// ์ผ๋ฐ ํจ์
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
// ํ์ดํ ํจ์
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
Parameters
์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ํ๋ผ๋ฏธํฐ๋ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฌํ๋ฉฐ, ์ด๋ฅผ ์์น ๋งค๊ฐ๋ณ์(Positional Parameters)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
function multiply(a, b) {
return a * b;
}
multiply(3, 5); // 15
Dart์์ ์์น ๋งค๊ฐ๋ณ์์ ๋ค์๋ ๋งค๊ฐ๋ณ์(Named Parameters)๋ฅผ ๋ชจ๋ ์ง์ํ๋ค. ๋ค์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ ํธ์ถ ์ ํ๋ผ๋ฏธํฐ ์์๋ฅผ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค. ๋ค์๋ ๋งค๊ฐ๋ณ์๋ ์ค๊ดํธ {}
๋ฅผ ์ด์ฉํด ์ ์ํ๋ฉฐ, required
ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ์ ์ด๋ค. ์ ํ์ ๋งค๊ฐ๋ณ์๋ null safety๋ฅผ ์ํด ๊ธฐ๋ณธ๊ฐ์ ํ ๋นํ๊ฑฐ๋ nullable๋ก ์ง์ ํด์ผ ํ๋ค.
multiply({required int a, required int b}) {
return a * b;
}
multiply(a: 3, b: 5); // 15
multiply(b: 5, a: 3); // 15
๋ค์๋ ๋งค๊ฐ๋ณ์๋ ํ์ ์์น ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ์ฌ์ฉํ ์๋ ์๋๋ฐ, ์ด๋ ์์น ๋งค๊ฐ๋ณ์ ๋ค์ ์์นํด์ผ ํ๋ค.
multiply(bool x, {required int a, int b = 5, int? c}) { ... }
multiply(false, a: 3); // OK
multiply(false, a: 3, b: 9); // OK
multiply(false, c: 9, a: 3, b: 2); // OK
์์น ๋งค๊ฐ๋ณ์๋ฅผ ์ ํ์ ์ผ๋ก ๋ง๋ค ๋ []
๋๊ดํธ๋ฅผ ์ฌ์ฉํ๋ค. ์ ํ์ ๋งค๊ฐ๋ณ์๋ ํญ์ ํ์ ๋งค๊ฐ๋ณ์ ๋ค์ ์์นํด์ผ ํ๋ค. ์ฐธ๊ณ ๋ก ์์น ๋งค๊ฐ๋ณ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํ์(required)๋ค.
// b์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ๊ณ c์ nullable๋ก ์ง์ ํ์ผ๋ฏ๋ก ์ ํจ
multiply(int a, [int b = 5, int? c]) { ... }
// ํ์ ๋งค๊ฐ๋ณ์ c๊ฐ ์ ํ์ ๋งค๊ฐ๋ณ์ b ๋ค์ ์์นํ๋ฏ๋ก ์ ํจํ์ง ์์
multiply(int a, [int b = 5], int c) { ... }
// ์ ํ์ ๋งค๊ฐ๋ณ์ b, c๊ฐ ๊ธฐ๋ณธ๊ฐ ํน์ nullable๋ก ์ง์ ๋์ง ์์์ผ๋ฏ๋ก ์ ํจํ์ง ์์
multiply(int a, [int b, int c]) { ... }
์๋๋ ์ ํ์ ์์น ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ํจ์ ํธ์ถ ์์.
multiply(int a, [int b = 5, int? c]) { ... }
multiply(3); // OK
multiply(3, 5); // OK
multiply(3, 5, 7); // OK
First-class functions
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก Dart๋ ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด(first-class)๋ก ์ทจ๊ธํ๋ค. ๋ฐ๋ผ์ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๊ฑฐ๋ ๋ณ์์ ํ ๋นํ ์ ์๋ค.
void printElement(int element) {
print(element);
}
var list = [1, 2, 3];
list.forEach(printElement);
Anonymous functions
์๋ฐ์คํฌ๋ฆฝํธ์ Dart ๋ชจ๋ ์ต๋ช ํจ์๋ฅผ ์ง์ํ๋ค.
var blockFunc = optionalCallback ?? (int a, int b) { return a * b; };
var singleFunc = (int a, int b) => a * b;
์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ ์ต๋ช
ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ ๋ฌํ ์ ์๋ค. ์ฐธ๊ณ ๋ก Dart์ map()
๋ฉ์๋๋ Iterable์ ๋ฐํํ๊ณ , toList()
๋ฉ์๋๋ ์ดํฐ๋ฌ๋ธ์ List๋ก ๋ณํํ๋ค.
[1, 2, 3].map((e) => e + 3).toList();
Generator functions
Dart ์ญ์ ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ์ง์ํ๋ค. ํจ์ ํ๋ผ๋ฏธํฐ ๋ค์ sync*
ํค์๋๋ฅผ ๋ถ์ด๋ฉด ์ดํฐ๋ฌ๋ธ์ ๋ฐํํ๋ค. ์ ๋๋ ์ดํฐ ํจ์์์ yield
ํค์๋๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ ํญ๋ชฉ์ ์ดํฐ๋ฌ๋ธ์ ์ถ๊ฐํ ์ ์๋ค.
Iterable<int> naturalsTo(int n) sync* {
int k = 0;
while (k < n) {
yield k++;
}
}
print(naturalsTo(5).toList()); // [0, 1, 2, 3, 4]
yield*
ํค์๋๋ฅผ ์ฌ์ฉํด์ ๋ค๋ฅธ ์ดํฐ๋ฌ๋ธ์ ๋ชจ๋ ๊ฐ์ ํ ๋ฒ์ ์ถ๊ฐํ ์ ์๋ค.
Iterable<int> doubleNaturalsTo(int n) sync* {
int k = 0;
while (k < n) {
yield* [k, k];
k++;
}
}
print(doubleNaturalsTo(3).toList()); // [0, 0, 1, 1, 2, 2]
Statements
Control flow (if/else, for, while, switch)
Dart์ for-in
๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ for-of
์ฒ๋ผ ์๋ํ๋ค
for (final i in [1, 2, 3]) {
print(i); // 1, 2, 3
}
์๋ฐ์คํฌ๋ฆฝํธ์ switch ๋ฌธ์ fall-through ๋์์ด ์ ์ฉ๋ผ์ case์ break
, return
๋ฌธ์ด ์์ผ๋ฉด ๋ค์ case๋ฅผ ์ด์ด์ ์คํํ๋ค. ๋ฐ๋ฉด Dart๋ ๊ธฐ๋ณธ์ ์ผ๋ก fall-through๋ฅผ ํ์ฉํ์ง ์์ผ๋ฉฐ, continue
ํค์๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ case ๋ณธ๋ฌธ์ด ๋น์ด์์ ๋๋ง ํ์ฉํ๋ค.
// JS
const value = 2;
switch (value) {
case 1:
console.log("Case 1");
case 2:
console.log("Case 2");
case 3:
console.log("Case 3");
default:
console.log("Default case");
}
// ์ถ๋ ฅ: Case 2, Case 3, Default case
// Dart
var value = 2;
switch (value) {
case 1: // case ๋ณธ๋ฌธ์ด ๋น์ด์์ผ๋ฏ๋ก ๋ค์ case ์คํ
case 2:
print("Case 1 or 2");
case 3:
print("Case 3");
default:
print("Default case");
}
// ์ถ๋ ฅ: Case 1 or 2
Dart์ switch
๋ฌธ์์ case
์ ๋ ์ด๋ธ์ ์ถ๊ฐํ ์ ์๋๋ฐ, continue
๋ฌธ์์ ๋ช
์ํ case
๋ ์ด๋ธ๋ก ๋ฐ๋ก ์ด๋(์ผ์ข
์ ์ ํ)ํ ์๋ ์๋ค.
var value = 1;
switch (value) {
case 1:
print('Case 1');
continue three;
case 2:
print('Case 2');
three:
case 3:
print('Case 3');
}
// ์ถ๋ ฅ: Case 1, Case 3
Operators
Dart๋ operator
ํค์๋๋ก ๊ธฐ์กด ์ฐ์ฐ์๋ฅผ ์ค๋ฒ๋ก๋ฉ ํ ์ ์๋ค(์ฐ์ฐ์ ์ฌ์ ์).
class Vector {
// ํด๋์ค ํ๋ ์ ์ธ
final double x;
final double y;
final double z;
// ์์ฑ์ ์ด๊ธฐํ
Vector(this.x, this.y, this.z);
// ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ - ๋ฐํํ์
operator ์ฐ์ฐ์(์ธ์ํ์
์ธ์) { ์ค๋ฒ๋ก๋ฉ ๋ก์ง }
Vector operator +(Vector other) {
return Vector(x + other.x, y + other.y, z + other.z);
}
}
void main() {
var v1 = Vector(1, 2, 3);
var v2 = Vector(4, 5, 6);
// v1์ ์ค๋ฒ๋ก๋ฉ๋ + ์ฐ์ฐ์ ํธ์ถ. other ์ธ์์ v2๊ฐ ์ ๋ฌ๋๊ณ ์๋ก์ด Vector ์ธ์คํด์ค ๋ฐํ
var v3 = v1 + v2;
// ์ถ๋ ฅ: 5.0, 7.0, 9.0
print("${v3.x}, ${v3.y}, ${v3.z}");
}
๋ ์ธ์ด์ ์ฐ์ ์ฐ์ฐ์๋ ๋์ผํ์ง๋ง Dart๋ ๋๋์
์ ๊ฒฐ๊ณผ๋ฅผ ์ ์๋ก ๋ฐํํ๋ ~/
์ฐ์ฐ์๊ฐ ์กด์ฌํ๋ค.
์๋ฏธ | JavaScript ์ฐ์ฐ์ | Dart ์ฐ์ฐ์ |
๋ง์ | + |
+ |
๋บ์ | - |
- |
๋จํญ ๋ง์ด๋์ค, ๋ถ์ | -expr |
-expr |
๊ณฑ์ | * |
* |
๋๋์ | / |
/ |
์ ์ ๋๋์ | ~/ |
|
๋๋จธ์ง ์ฐ์ฐ | % |
% |
์ ์ ์ฆ๊ฐ | ++x |
++x |
ํ์ ์ฆ๊ฐ | x++ |
x++ |
์ ์ ๊ฐ์ | --x |
--x |
ํ์ ๊ฐ์ | x-- |
x-- |
print(25 == 50.4 ~/ 2); // true
์๋ฐ์คํฌ๋ฆฝํธ์ Dart์ ๋๋ฑ/๊ด๊ณ ์ฐ์ฐ์๋ ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. Dart์์ ์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ ๊ฐ์ ๋ก ํ์ ์ ๋ณํํ ํ ๋น๊ตํ๋ ์ถ์์ (๋์จํ) ๋น๊ต ์ฐ์ฐ์๊ฐ ์๊ณ ํญ์ ํ์ ์ ๊ณ ๋ คํ์ฌ ๊ฐ์ ๋น๊ตํ๋ค.
์๋ฏธ | JavaScript ์ฐ์ฐ์ | Dart ์ฐ์ฐ์ |
์๊ฒฉํ ๋๋ฑ | === |
== |
์ถ์์ ๋๋ฑ | == |
|
์๊ฒฉํ ๋ถ๋ฑ | !== |
!= |
์ถ์์ ๋ถ๋ฑ | != |
|
ํฌ๋ค | > |
> |
์๋ค | < |
< |
ํฌ๊ฑฐ๋ ๊ฐ๋ค | >= |
>= |
์๊ฑฐ๋ ๊ฐ๋ค | <= |
<= |
ํ์
ํ
์คํธ ์ฐ์ฐ์๋ ๋ ์ธ์ด๊ฐ ์ด์ง ๋ค๋ฅด๋ค. Dart์ is
์ฐ์ฐ์๋ ํน์ ํ์
์ ์ธ์คํด์ค์ธ์ง ํน์ ํด๋น ํ์
์ ๊ตฌํํ๋์ง ํ์ธํ๋ค(๋ฐํ์ ํ์
๊ฒ์ฌ). ์๋ฅผ๋ค์ด Dart์์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ Object๋ฅผ ์์ ๋ฐ๊ธฐ ๋๋ฌธ์ {} is Object
ํํ์์ true
๋ฅผ ๋ฐํํ๋ค.
์๋ฏธ | JavaScript ์ฐ์ฐ์ | Dart ์ฐ์ฐ์ |
ํ์ ์บ์คํธ | x as T |
|
๊ฐ์ฒด๊ฐ ์ง์ ๋ ํ์ ์ธ์ง ํ์ธ | x instanceof T |
x is T |
๊ฐ์ฒด๊ฐ ์ง์ ๋ ํ์ ์ด ์๋์ง ํ์ธ | !(x instanceof T) |
x is! T |
var num = 42;
// num์ด int ํ์
์ธ์ง ํ์ธ
if (num is int) { /* ... */ }
์๋ฐ์คํฌ๋ฆฝํธ์ Dart์ ๋
ผ๋ฆฌ ์ฐ์ฐ์๋ ๋์ผํ์ง๋ง ์กฐ๊ฑด๋ฌธ์์ ๊ฐ์ ํ๊ฐํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ๊ฐ์ ๋ถ๋ฆฌ์ธ ๊ฐ์ผ๋ก ๋ณํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋น ๋ฌธ์์ด ""
๊ณผ ์ซ์ 0
์ falsy ๊ฐ์ผ๋ก ๊ฐ์ฃผ๋ผ์ false
๋ก ํ๊ฐ๋๋ค. ๋ฐ๋ฉด Dart์์ ์กฐ๊ฑด๋ฌธ๊ณผ ๋
ผ๋ฆฌ ์ฐ์ฐ์์ ํผ์ฐ์ฐ์๋ ์ค์ง ๋ถ๋ฆฌ์ธ ํ์
๋ง ์ฌ์ฉํ ์ ์๋ค.
์๋ฏธ | JavaScript ์ฐ์ฐ์ | Dart ์ฐ์ฐ์ |
NOT | !x |
!x |
OR | || |
|| |
AND | && |
&& |
var x = "foo";
// x๋ ๋ถ๋ฆฌ์ธ ํ์
์ด ์๋๋ฏ๋ก ์๋ฌ
if (x) { /* ... */ }
// String.isNotEmpty๋ ๋น๋ฌธ์์ด ์ฌ๋ถ๋ฅผ ๋ถ๋ฆฌ์ธ์ผ๋ก ๋ฐํํ๋ฏ๋ก OK
if (x.isNotEmpty) { /* ... */ }
๋นํธ ์ฐ์ฐ์(Bitwise)๋ ๋ ์ธ์ด๊ฐ ๊ฑฐ์ ๋์ผํ๋ค.
์๋ฏธ | JavaScript ์ฐ์ฐ์ | Dart ์ฐ์ฐ์ |
AND | & |
& |
OR | | |
| |
XOR | ^ |
^ |
NOT | ~expr |
~expr |
์ผ์ชฝ ์ํํธ | << |
<< |
์ค๋ฅธ์ชฝ ์ํํธ | >> |
>> |
๋ถํธ ์๋ ์ค๋ฅธ์ชฝ ์ํํธ | >>> |
>>> |
Dart๋ ํํ์์ ํ๊ฐํ๊ธฐ ์ํ ์กฐ๊ฑด๋ถ ์ฐ์ฐ์(์ผํญ ์ฐ์ฐ์)๋ฅผ ์ง์ํ๋ค.
int num1 = 10;
int num2 = 15;
int max = (num1 > num2) ? num1 : num2;
print("The greatest number is $max"); // The greatest number is 15
Assignment operators
๊ฐ ํ ๋น์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ผํ๊ฒ =
์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ค. Dart๋ ??=
๋ ๋ณํฉ ์ฐ์ฐ์(null-aware variant)๋ฅผ ์ง์ํ๋ค.
int? a;
int b = a ?? 5;
print(b); // 5
์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ ๋ณ์์ ๊ฐ์ ํ ๋นํจ๊ณผ ๋์์ ์ฐ์ฐ์ ์ํํ๋ ์ถ์ฝํ ํ ๋น ์ฐ์ฐ์๋ฅผ ์ง์ํ๋ค. ~/=
์ ์ ๋๋์
ํ ๋น์ ์ ์ธํ๊ณ Dart, JavaScript์ ์ถ์ฝํ ์ฐ์ฐ์๋ ๋ชจ๋ ๋์ผํ๋ค.
์ฐ์ฐ์ | ์ค๋ช |
= |
ํ ๋น |
+= |
๋ง์ ํ ๋น |
-= |
๋บ์ ํ ๋น |
*= |
๊ณฑ์ ํ ๋น |
/= |
๋๋์ ํ ๋น |
~/= |
์ ์ ๋๋์ ํ ๋น |
%= |
๋๋จธ์ง(๋ชจ๋๋ก) ํ ๋น |
>>>= |
๋ถํธ ์๋ ์ค๋ฅธ์ชฝ ์ํํธ ํ ๋น |
^= |
๋นํธ XOR ํ ๋น |
<<= |
์ผ์ชฝ ์ํํธ ํ ๋น |
>>= |
์ค๋ฅธ์ชฝ ์ํํธ ํ ๋น |
&= |
๋นํธ AND ํ ๋น |
|= |
๋นํธ OR ํ ๋น |
int num = 5;
num *= 5;
print(num); // 25
Cascades (..
operator)
Dart์์ ๋์ผํ ๊ฐ์ฒด์ ์ฌ๋ฌ ๋ฉ์๋ ํธ์ถ์ด๋ ์์ฑ ์ค์ ์ ์ฐ์์ ์ผ๋ก ์ํํ๋ Cascades ๊ตฌ๋ฌธ์ ์ง์ํ๋ค. ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํด์ ์ฐธ์กฐํ์ง ์๊ณ ์ํ๋ ์์ ์ ์ํํ ์ ์๋ ์ฅ์ ์ด ์๋ค.
Cascades ๊ตฌ๋ฌธ์ ..
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์๋ ๊ตฌ๋ฌธ์ด๋ค. ..
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ ๋ฉ์๋ ์ฒด์ด๋์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
Map<String, dynamic> user = {'name': 'John', 'age': 30};
user
..['age'] = 31
..['city'] = 'Los Angeles';
print(user); // {name: John, age: 31, city: Los Angeles}
๊ฐ์ฒด๊ฐ null์ผ ์๋ ์๋ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ Cascades ๊ตฌ๋ฌธ์ ?..
๋ฅผ ์ฌ์ฉํ๋ค
Map<String, dynamic>? user;
// user๊ฐ null์ผ ๊ฒฝ์ฐ ?.. ์ฐ์ฐ์๋ null์ ๋ฐํํ๊ณ Cascades ๊ตฌ๋ฌธ์ ์คํ๋์ง ์๋๋ค
user
?..['age'] = 31
..['city'] = 'Los Angeles';
print(user); // null
Collections
Lists
Dart์ List๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด๊ณผ ๋์ผํ๊ฒ ๋๊ดํธ๋ก ๋ฌถ๊ณ ์ผํ๋ก ๊ฐ์ ๊ตฌ๋ถํ๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๋ค.
// ์ข์ธก List<String> : ๋ฆฌ์คํธ ๋ณ์ ํ์
์ ๋ช
์์ ์ผ๋ก ์ง์
// ์ฐ์ธก <String> : ๋ฆฌ์คํธ ์์ ํ์
์ ๋ช
์์ ์ผ๋ก ์ง์
// final : ๋ฆฌ์คํธ์ ์์๋ ๋ณ๊ฒฝํ ์ ์์ง๋ง ๋ฆฌ์คํธ ์์ฒด๋ ๋ค๋ฅธ ๋ฆฌ์คํธ๋ก ์ฌํ ๋น ๋ถ๊ฐ
final List<String> list1 = <String>['one', 'two', 'three'];
// ๋ฆฌ์คํธ ์์ ํ์
๋ง <String>์ผ๋ก ์ง์ ํ ์์
final list2 = <String>['one', 'two', 'three'];
// ํ์
์ ์ง์ ํ์ง ์์์ง๋ง List<String>์ผ๋ก ์ถ๋ก ๋จ
final list3 = ['one', 'two', 'three'];
์ธ๋ฑ์ค ์ฐ์ฐ์๋ก ๊ฐ์ ์กฐํํ๊ฑฐ๋ ํ ๋นํ ์ ์๋ค.
final fruits = <String>['apple', 'orange', 'pear'];
final fruit = fruits[1]; // orange
fruits[1] = 'pear';
print(fruits); // [apple, pear, pear]
add()
, addAll()
๋ฉ์๋๋ก ๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
final fruits = <String>['apple', 'orange', 'pear'];
fruits.add('peach'); // 1๊ฐ ์์๋ฅผ ์ถ๊ฐํ ๋
fruits.addAll(['kiwi', 'mango']); // ์ฌ๋ฌ ์์๋ฅผ ์ถ๊ฐํ ๋
insert()
, insertAll()
๋ฉ์๋๋ก ํน์ ์ธ๋ฑ์ค์ ์์๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ๊ธฐ์กด ์ธ๋ฑ์ค์ ์๋ ์์๋ ๋ค๋ก ๋ฐ๋ ค๋๊ฒ ๋๋ค.
final fruits = <String>['apple', 'orange', 'pear'];
// 1๋ฒ์งธ ์ธ๋ฑ์ค์ peach ์ฝ์
-> [apple, peach, orange, pear]
fruits.insert(1, 'peach');
// 2๋ฒ์งธ ์ธ๋ฑ์ค์ kiwi, mango ์ฝ์
-> [apple, peach, kiwi, mango, orange, pear]
fruits.insertAll(2, ['kiwi', 'mango']);
๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฆฌ์คํธ์ ์์๋ฅผ ์ ๊ฑฐ ํ ์ ์๋ค.
final fruits = <String>['apple', 'orange', 'pear'];
// 'pear' ๊ฐ์ ๊ฐ์ง ์์ ์ ๊ฑฐ
fruits.remove('pear');
// ๋ฆฌ์คํธ์ ๋ง์ง๋ง ์์ ์ ๊ฑฐ
fruits.removeLast();
// 1๋ฒ ์ธ๋ฑ์ค์ ์๋ ์์ ์ ๊ฑฐ (2๋ฒ์งธ ์์ ์ ๊ฑฐ)
fruits.removeAt(1);
// 1(ํฌํจ)~3(๋ฏธํฌํจ) ์ธ๋ฑ์ค์ ์๋ ์์ ์ ๊ฑฐ (1~2๋ฒ ์ธ๋ฑ์ค์ ์์ ์ ๊ฑฐ)
fruits.removeRange(1, 3);
// 'p'๋ฅผ ํฌํจํ๋ ๋ชจ๋ ์์ ์ ๊ฑฐ (์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ ์ ๊ฑฐ)
fruits.removeWhere((fruit) => fruit.contains('p'));
length
์์ฑ์ผ๋ก ์์ ๊ฐ์๋ฅผ ํ์ธํ ์ ์๋ค.
final fruits = <String>['a', 'b', 'c'];
print(fruits.length); // 3
isEmpty
, isNotEmpty
๋ฉ์๋๋ก ๋ฆฌ์คํธ๊ฐ ๋น์๊ฑฐ๋ ๋น์ด์์ง ์์์ง ํ์ธํ ์ ์๋ค.
var fruits = [];
print(fruits.isEmpty); // true
print(fruits.isNotEmpty); // false
List.filled()
๋ฉ์๋๋ก ๊ณ ์ ๋ ๊ธธ์ด(length)์ ์ด๊ธฐ๊ฐ์ ๊ฐ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ ์ ์๋ค. ์ด ๋ฉ์๋๋ก ์์ฑํ ๋ฆฌ์คํธ๋ ์์ ์ถ๊ฐ/์ ๊ฑฐ๋ ๋ถ๊ฐ๋ฅํ๊ณ ์กฐํ/์
๋ฐ์ดํธ๋ง ํ ์ ์๋ค. 3๋ฒ์งธ ์ธ์ growable
๋ฅผ true
๋ก ์ค์ ํ๋ฉด ๊ฐ๋ณ ๊ธธ์ด ๋ฆฌ์คํธ๋ก ์์ฑ๋ผ์ ์ถ๊ฐ/์ ๊ฑฐ๋ ๊ฐ๋ฅํด์ง๋ค.
// ์ฒซ๋ฒ์งธ ์ธ์: ๋ฆฌ์คํธ ๊ธธ์ด, 2๋ฒ์งธ ์ธ์: ์ฑ์ธ ๊ฐ, 3๋ฒ์งธ ์ ํ์ ์ธ์: ๊ณ ์ /๊ฐ๋ณ ๊ธธ์ด ์ฌ๋ถ
final list1 = List.filled(3, 'a');
list1.removeLast(); // Cannot remove from a fixed-length list
list1[1] = 'b'; // OK
final list2 = List.filled(3, 'a', growable: true);
list2.removeLast();
print(list2); // ['a', 'a']
List.generate()
ํจ์๋ ์ง์ ๋ ๊ธธ์ด์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ณ , ์์ฑ์ ํจ์(2๋ฒ์งธ ์ธ์)๊ฐ ๋ฐํํ ๊ฐ์ผ๋ก ์ฑ์ด๋ค. ์์ฑ๋ ๋ฆฌ์คํธ๋ growable
๊ฐ์ ๋ฐ๋ผ ๊ณ ์ /๊ฐ๋ณ ๊ธธ์ด์ผ ์ ์๋ค. JS์ Array.from()
๋ฉ์๋์ ์ฌ๋ฌ๋ชจ๋ก ์ ์ฌํ ์ ์ด ๋ง๋ค.
// ์ฒซ๋ฒ์งธ ์ธ์: ๋ฆฌ์คํธ ๊ธธ์ด, 2๋ฒ์งธ ์ธ์: ์์ฑ์ ํจ์, 3๋ฒ์งธ ์ ํ์ ์ธ์: ๊ณ ์ /๊ฐ๋ณ ๊ธธ์ด ์ฌ๋ถ
final list = List.generate(3, (i) => 'a-$i', growable: true);
print(list); // [a-0, a-1, a-2]
Sets
Dart๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ค๋ฅด๊ฒ {}
์ค๊ดํธ๋ฅผ ์ฌ์ฉํ ๋ฆฌํฐ๋ด ํ์์ผ๋ก ์งํฉ์ ์ ์ํ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ Set์ ์ฝ์
์์๋ฅผ ๊ธฐ์ตํ์ง๋ง Dart๋ ์์๋ฅผ ๊ธฐ์ตํ์ง ์๋ ์ ์ด ๋ค๋ฅด๋ค. ์์์ ์ ์ผ์ฑ์ ๋ณด์ฅํ๋ ์ ์ ๋์ผํ๋ค.
final abc = {'a', 'b', 'c'};
{} ๋น ์ค๊ดํธ ๋ฆฌํฐ๋ด์ ๊ธฐ๋ณธ์ ์ผ๋ก Map์ ์์ฑํ๋ค. Set(์งํฉ)์ ์์ฑํ๋ ค๋ฉด ๋ช ์์ ์ผ๋ก ํ์ ์ ์ง์ ํด์ผ ํ๋ค. Set์ ์ ๋ค๋ฆญ ํ์ ์ธ์๋ 1๊ฐ๋ค. ํท๊ฐ๋ฆด ์ ์์ผ๋ ์ฃผ์ํ์.
final names = {}; // Map<dynamic, dynamic>
final names = <String, int>{}; // Map<String, int>
Map<String, int> name = {}; // Map<String, int>
final names = <String>{}; // Set<String>
Set<String> names = {}; // Set<String>
add()
, addAll()
๋ฉ์๋๋ก ์งํฉ์ ๊ฐ์ ์ถ๊ฐํ ์ ์๋ค.
final fruits = {'apple', 'orange', 'pear'};
fruits.add('peach'); // 1๊ฐ ์์๋ง ์ถ๊ฐํ ๋
fruits.addAll(['kiwi', 'mango']); // ์ฌ๋ฌ ์์๋ฅผ ์ถ๊ฐํ ๋
print(fruits); // {apple, orange, pear, peach, kiwi, mango}
๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์งํฉ์ ๊ฐ์ ์ ๊ฑฐํ ์ ์๋ค.
final fruits = {'apple', 'orange', 'pear'};
// 'pear' ๊ฐ์ ๊ฐ์ง ์์ ์ ๊ฑฐ (1๊ฐ ์์ ์ ๊ฑฐ)
fruits.remove('pear');
// 'orange', 'apple' ์์ ์ ๊ฑฐ (์ฌ๋ฌ ์์ ์ ๊ฑฐ)
fruits.removeAll(['orange', 'apple']);
// 'p'๋ฅผ ํฌํจํ๋ ๋ชจ๋ ์์ ์ ๊ฑฐ (์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ ์ ๊ฑฐ)
fruits.removeWhere((fruit) => fruit.contains('p'));
length
์์ฑ์ผ๋ก ์งํฉ์ ๊ฐ์๋ฅผ ํ์ธํ ์ ์๋ค.
final fruits = {'apple', 'orange', 'pear'};
print(fruits.length); // 3
isEmpty
, isNotEmpty
๋ฉ์๋๋ก ์งํฉ์ด ๋น์๊ฑฐ๋ ๋น์ด์์ง ์์์ง ํ์ธํ ์ ์๋ค.
final fruits = {'apple', 'orange', 'pear'};
print(fruits.isEmpty); // false
print(fruits.isNotEmpty); // true
Maps
Dart์ Map์ ์๋ฐ์คํฌ๋ฆฝํธ์ Map ๊ฐ์ฒด์ฒ๋ผ ๋ชจ๋ ์ ํ์ ํค/๊ฐ์ผ๋ก ์ง์ ํ ์ ์๋ค. Dart์ Map์ ํด์ ํ ์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ํค๋ ํด์ ํ ์ ์์ด์ผ ํ๋ค. ๋ฆฌํฐ๋ด์ ์ด์ฉํด์ Map์ ์ ์ํ ์ ์๋ค. ํค๊ฐ ๋ฌธ์์ด์ด๋ผ๋ฉด ํญ์ ๋ฐ์ดํ๋ฅผ ๋ถ์ฌ์ผ ํ๋ค.
final grades = { 'Alice': 'A', 'Bob': 'B', 'Charlie': 'C' };
์ธ๋ฑ์ค ์ฐ์ฐ์๋ก ์ํ๋ ๊ฐ์ ์กฐํ/์ ๋ฐ์ดํธ/์์ ํ ์ ์๋ค. ์กฐํํ ํค๊ฐ ์๋ ๊ฒฝ์ฐ์ null์ ๋ฐํํ๋ค.
final grades = { 'Alice': 'A' };
print(grades['Alice']); // A
print(grades['Bob']); // null
grades['Bob'] = 'B'; // ์ถ๊ฐ
grades['Bob'] = 'B+'; // ์
๋ฐ์ดํธ
containsKey()
๋ฉ์๋๋ก ํค ํฌํจ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
final grades = { 'Alice': 'A' };
print(grades.containsKey('Alice')); // true
addAll()
๋ฉ์๋๋ก ๋ค๋ฅธ Map์ ์ถ๊ฐํ๊ฑฐ๋ addEntries()
๋ฉ์๋๋ก MapEntry ๊ฐ์ฒด(์ดํฐ๋ฌ๋ธ)๋ฅผ ์ถ๊ฐํ ์ ์๋ค. MapEntry๋ Map์ ๊ฐ๋ณ ํค/๊ฐ ์์ ๋ํ๋ด๋ ๊ฐ์ฒด๋ค.
final grades = { 'Alice': 'A' };
grades.addAll({ 'Bob': 'B' });
print(grades); // {Alice: A, Bob: B}
final charlieGrade = MapEntry('Charlie', 'C'); // MapEntry(Charlie: C)
grades.addEntries([charlieGrade]);
print(grades); // {Alice: A, Bob: B, Charlie: C}
remove()
๋ก ํน์ ํญ๋ชฉ์ ์ ๊ฑฐํ๊ฑฐ๋, removeWhere()
๋ก ์กฐ๊ฑด์ ๋ถํฉํ๋ ํญ๋ชฉ์ ์ ๊ฑฐํ ์ ์๋ค.
final grades = {'Alice': 'A', 'Bob': 'B', 'Charlie': 'C'};
grades.remove('Alice');
grades.removeWhere((key, value) => value == 'B');
print(grades); // {Charlie: C}
length
์์ฑ์ผ๋ก ํญ๋ชฉ์ ๊ฐ์๋ฅผ ํ์ธํ ์ ์๋ค.
final grades = {'Alice': 'A', 'Bob': 'B', 'Charlie': 'C'};
print(grades.length); // 3
isEmpty
, isNotEmpty
๋ฉ์๋๋ก Map์ด ๋น์๊ฑฐ๋ ๋น์ด์์ง ์์์ง ํ์ธํ ์ ์๋ค.
final grades = {'Alice': 'A', 'Bob': 'B', 'Charlie': 'C'};
print(grades.isEmpty); // false
print(grades.isNotEmpty); // true
Unmodifiable
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ฑ์ ์ง์ํ์ง ์์ง๋ง Dart๋ ๋ถ๋ณ์ฑ์ผ๋ก ๋ง๋๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์์ ํ๋ฉด ์ ๋๋ ์ปดํ์ผ ์์ ์ปฌ๋ ์
์ const
ํค์๋๋ฅผ ์ฌ์ฉํ๋ค(์ถ๊ฐ/์ ๊ฑฐ ๋ถ๊ฐ).
const fruits = <String>{'apple', 'orange', 'pear'};
final
ํค์๋๋ก ์ ์ํ ์งํฉ์ ์ฌํ ๋น ํ ์ ์์ง๋ง ์์์ ์ถ๊ฐ/์ ๊ฑฐ๋ ํ์ฉํ๋ค.
final fruits = <String>{'apple', 'orange', 'pear'};
fruits.remove('apple'); // OK
fruits.add('banana'); // OK
unmodifiable
์์ฑ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐํ์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ ์ ์๋ค(์ถ๊ฐ/์ ๊ฑฐ ๋ถ๊ฐ).
final _set = Set<String>.unmodifiable(['a', 'b', 'c']);
final _list = List<String>.unmodifiable(['a', 'b', 'c']);
final _map = Map<String, String>.unmodifiable({'foo': 'bar'});
Spread operator
Dart๋ ์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ ...
์ ๊ฐ ์ฐ์ฐ์๋ฅผ ์ง์ํ๋ค.
final list1 = [1, 2, 3];
final list2 = [0, ...list1];
print(list2); // [0, 1, 2, 3]
์ปฌ๋ ์
์ด null ์ผ ์ ์๋ ๊ฒฝ์ฐ์ ...?
๋ ์ธ์ ์ ๊ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
final list1 = null;
final list2 = [0, ...?list1];
print(list2); // [0]
์ ๊ฐ ์ฐ์ฐ์๋ List, Set, Map ๋ฑ ์ดํฐ๋ฌ๋ธ์์ ์ฌ์ฉํ ์ ์๋ค. Dart์ ๋ฌธ์์ด์ Iterable ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ๋์ด ์์ง ์์ง๋ง split()
๋ฉ์๋ ๋ฑ์ ํ์ฉํด์ ์ดํฐ๋ฌ๋ธ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๋ค. ์ฐธ๊ณ ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฌธ์์ด์ Iterable ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ๋์ด ์๋ ์ดํฐ๋ฌ๋ธ์ด์ด์ ์ ๊ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
// Map์์ ์ ๊ฐ ์ฐ์ฐ์ ์ฌ์ฉ ์์
final map1 = { 'a': 1, 'b': 2 };
final map2 = { ...map1, 'c': 3 };
print(map2); // {a: 1, b: 2, c: 3}
// Set์์ ์ ๊ฐ ์ฐ์ฐ์ ์ฌ์ฉ ์์
final set1 = {1, 2, 3};
final set2 = {0, ...set1};
print(set2); // {0, 1, 2, 3}
Collection if/for
Dart๋ ์ปฌ๋ ์
(List, Set ๋ฑ) ๋ด๋ถ์์ if-else
, for
๋ฌธ์ ์ฌ์ฉํ์ฌ ์์๋ฅผ ๋์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ค.
bool isLoggedIn = true;
final userMenu = [
'Profile',
'Settings',
if (isLoggedIn) 'Logout' else 'Login',
if (isLoggedIn) 'Edit'
];
print(userMenu); // [Profile, Settings, Logout, Edit]
์ปฌ๋ ์
์์์ for
๋ฌธ์ ํ์ฉํ๋ฉด ๋ค๋ฅธ ์ปฌ๋ ์
์ ๋งคํํ ์ ์๋ค.
final keys = ['one', 'two', 'three'];
final values = [1, 2, 3];
final map = {
'zero': 0,
for (var i = 0; i < keys.length; i++) keys[i]: values[i]
};
print(map); // {zero: 0, one: 1, two: 2, three: 3}
for
, if
๋ฌธ์ ํจ๊ป ์ฌ์ฉํ ์๋ ์๋ค.
final numbers = List.generate(5, (i) => i + 1); // [1, 2, 3, 4, 5]
final doubledEvenNumbers = [
for (var number in numbers)
if (number % 2 == 0) number * 2 else number
];
print(doubledEvenNumbers); // [1, 4, 3, 8, 5]
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Flutter] ํ๋ฌํฐ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ for macOS
[Flutter] ํ๋ฌํฐ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ for macOS
2024.09.03 -
[Dart] ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ ๋คํธ ํ์ต - Part 2
[Dart] ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ ๋คํธ ํ์ต - Part 2
2024.08.21 -
[Algorithm] ํ๋ก๊ทธ๋๋จธ์ค - ํผ๋ก๋ / ๋ฐฑํธ๋ํน์ผ๋ก ๋ชจ๋ ๋ถ๋ถ์งํฉ ์ฐพ๊ธฐ
[Algorithm] ํ๋ก๊ทธ๋๋จธ์ค - ํผ๋ก๋ / ๋ฐฑํธ๋ํน์ผ๋ก ๋ชจ๋ ๋ถ๋ถ์งํฉ ์ฐพ๊ธฐ
2024.07.29 -
[DevTools] ๋ฆฌ์กํธ ํ ์คํธ ํ๊ฒฝ(Vitest, React Testing Library) ๋ฐ CI ๊ตฌ์ถ
[DevTools] ๋ฆฌ์กํธ ํ ์คํธ ํ๊ฒฝ(Vitest, React Testing Library) ๋ฐ CI ๊ตฌ์ถ
2024.07.22