[Flutter] Dart ๊ธฐ์ด
1. Dart ์ธ์ด ์๊ฐ
Dart๋ Google์์ ๊ฐ๋ฐํ ์คํ ์์ค ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ค. ์น, ๋ชจ๋ฐ์ผ, ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ํนํ Flutter ํ๋ ์์ํฌ์ ์ฃผ์ ์ธ์ด๋ก ํ์ฉ๋๋ค.
2. ํน์ง
1. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
Dart๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ค.
์์, ์ธํฐํ์ด์ค, ๋ฏน์ค์ธ ๋ฑ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
๋ํ, Dart๋ ๋จ์ผ ์์๋ง์ ํ์ฉํ๋๋ฐ, ๋ฏน์ค์ธ์ ํตํด ๋ค์ค ์์๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
mixin
mixin์ ์ฌ๋ฌ ํด๋์ค ๊ณ์ธต์์ ์ฌ์ฌ์ฉํ ์ ์๋ ์ฝ๋๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ mixin๊ณผ ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
mixin Flyer {
void fly() {
print('Flying');
}
}
mixin Swimmer {
void swim() {
print('Swimming');
}
}
// ๊ธฐ๋ณธ ํด๋์ค
class Animal {
String name;
Animal(this.name);
void breathe() {
print('$name is breathing');
}
}
// Mixin ์ฌ์ฉ
class Bird extends Animal with Flyer {
Bird(String name) : super(name);
}
class Fish extends Animal with Swimmer {
Fish(String name) : super(name);
}
class Duck extends Animal with Flyer, Swimmer {
Duck(String name) : super(name);
}
void main() {
var bird = Bird('Sparrow');
bird.breathe(); // ์ถ๋ ฅ: Sparrow is breathing
bird.fly(); // ์ถ๋ ฅ: Flying
var fish = Fish('Salmon');
fish.breathe(); // ์ถ๋ ฅ: Salmon is breathing
fish.swim(); // ์ถ๋ ฅ: Swimming
var duck = Duck('Donald');
duck.breathe(); // ์ถ๋ ฅ: Donald is breathing
duck.fly(); // ์ถ๋ ฅ: Flying
duck.swim(); // ์ถ๋ ฅ: Swimming
}
mixin์ ์ฌ์ฉํ๋ฉด์ with ํค์๋์ ํจ๊ป ๋ค์ค ์์์ ์ฌ์ฉํ๋ฉฐ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
2. ์ปดํ์ผ ๋ฐฉ์ - JIT & AOT
JIT(Just-In-Time)
JIT๋ ์คํ ์ค ์ค์๊ฐ์ผ๋ก ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๋ฐฉ์์ด๋ค.
๊ฐ๋ฐ ์ค ์ค์๊ฐ์ผ๋ก ๋๋ฒ๊น ์ด ๊ฐ๋ฅํ๋ค.
Dart VM์ด ๊ฐ๋ฐ ๋ชจ๋์์ JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ด๋ Flutter์์ ์ค Hot Reload ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ค๋ค.
AOT(Ahead-Of-Time)
AOT๋ ํ๋ก๊ทธ๋จ ์คํ ์ ์ ์ฒด ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ ๋ฐฉ์์ด๋ค.
Java๋ฅผ ๋ฏธ๋ฆฌ ๋น๋ํ์ฌ jarํ์ผ๋ก ๋ง๋๋ ๊ฒ๊ณผ ๋น์ทํ๊ฒ, ๋ฏธ๋ฆฌ ์ฝ๋๋ฅผ ์ปดํ์ผํ์ฌ ์คํ ์ ์ถ๊ฐ์ ์ธ ์ปดํ์ผ ๊ณผ์ ์ด ํ์์๋ค.
Dart๋ ๋ฐฐํฌ ๋ชจ๋์์ AOT ์ปดํ์ผ์ ์ฌ์ฉํ๋ค. Flutter ์ฑ์ ๋ฐฐํฌํ ๋ Native ARM ๋๋ x86 ์ฝ๋๋ก ์ปดํ์ผ๋๋ค.
๋ฐ๋ผ์ ๊ฐ๋ฐ ์์๋ JIT๋ฅผ ์ด์ฉํ์ฌ Hot Reload๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ณ , ๋ฐฐํฌ ์์๋ AOT๋ฅผ ์ด์ฉํ์ฌ ์ต์ ํ๋ Native ์ฝ๋๋ฅผ ์์ฑํ๋ค.
2.2 Type safe
Dart๋ ์ ํ์ ํ์ ์์คํ ์ ๊ฐ์ง๊ณ ์๋ค.
์ ์ ์ ํ ๊ฒ์ฌ, ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ํตํด ํญ์ ๋ณ์์ ์ ์ ์ ํ๊ณผ ์ผ์นํ๋๋ก ๋ณด์ฅํ๋ค.
2.3 Null ์์ ์ฑ
Dart๋ null ์์ ์ฑ์ ํฌ๊ฒ ๊ฐํํ์๋ค.
Dart๋ ์ฒ์๋ถํฐ ๋ชจ๋ ๋ณ์๋ฅผ null์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
๋ง์ฝ ํด๋น ๋ณ์์ null์ด ๋ค์ด๊ฐ ์ ์์์ ์๋ฆฌ๋ ค๋ฉด, ?๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
int? i
์๋ ๋ณ์ i๊ฐ nullable์์ ๋ช ์ํ๋ค.
int i = a!;
๋ฐ๋๋ก !๋ Bang ์ฐ์ฐ์๋ก, ๊ฐ๋ฐ์๊ฐ null์ด ์๋์ ํ์ ํ๋ ๊ฒฝ์ฐ์ Dart์๊ฒ ์๋ฆด ์ ์๋ค.
String toString() {
if (code == 200) return 'OK';
return 'ERROR $code ${error!.toUpperCase()}';
}
2.3 ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ์ง์
Dart๋ async์ await ํค์๋๋ฅผ ํตํด ๋น๋๊ธฐ๋ฅผ ์ง์ํ๋ค.
์ด๋ฅผ ํตํด I/O ์์ ์ด๋ ๋คํธ์ํฌ ์์ฒญ ๋ฑ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
async๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค. await๋ฅผ ์ด์ฉํ๋ฉด ๋น๋๊ธฐ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๋ค.
await lookUpVersion();
Future<void> checkVersion() async {
var version = await lookUpVersion();
// Do something with version
}
3. ๊ธฐ๋ณธ ๋ฌธ๋ฒ
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ Java์ ๋ง์ด ๋ฎ์์๋ค.
3.1 ๋ณ์์ ๋ฐ์ดํฐ ํ์
var name = 'Bob'; // ํ์
์ถ๋ก
String name = 'Bob'; // ๋ช
์์ ํ์
์ ์ธ
final name = 'Bob'; // ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ณ์
const pi = 3.14; // ์ปดํ์ผ ํ์ ์์
๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ผ๋ก๋ int, double, String, bool ๋ฑ์ด ์๋ค.
3.2 ํจ์
int add(int a, int b) {
return a + b;
}
int multiply(int a, int b) => a * b;
3.3 ์ ์ด ํ๋ฆ ๋ฌธ์ฅ
if (condition) {
// ์ฝ๋
} else {
// ์ฝ๋
}
for (var i = 0; i < 5; i++) {
print(i);
}
while (condition) {
// ์ฝ๋
}
3.4 ํด๋์ค์ ๊ฐ์ฒด
class Person {
String name;
int age;
Person(this.name, this.age);
void sayHello() {
print('Hello, my name is $name');
}
}
var person = Person('Alice', 30);
person.sayHello();
3.5 ์ปฌ๋ ์
Dart๋ List, Set, Map ๋ฑ์ ์ปฌ๋ ์ ํ์ ์ ์ ๊ณตํ๋ค:
var list = [1, 2, 3];
var set = {1, 2, 3};
var map = {'key': 'value'};
3.6 ์ ๋ค๋ฆญ
Dart๋ ์ ๋ค๋ฆญ์ ์ง์ํ์ฌ ํ์ ์์ ์ฑ์ ๋์ผ ์ ์๋ค:
var list = [1, 2, 3];
var set = {1, 2, 3};
var map = {'key': 'value'};
3.7 ์์ธ ์ฒ๋ฆฌ
try {
// ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋
} catch (e) {
print('An error occurred: $e');
} finally {
// ํญ์ ์คํ๋๋ ์ฝ๋
}
4. Dart ์ธ์ด์ ๊ตฌ์กฐ์ ์๋ ๋ฐฉ์
4.1 Dart VM
Dart VM(Virtual Machine)์ Dart ์ฝ๋๋ฅผ ์คํํ๋ ํ๊ฒฝ์ด๋ค. ๊ฐ๋ฐ ์์๋ JIT ์ปดํ์ผ์ ํตํด ๋น ๋ฅธ ์คํ๊ณผ ๋๋ฒ๊น ์ ์ง์ํ๋ค.
4.2 ์ปดํ์ผ ํ๋ก์ธ์ค
Dart๋ ๊ฐ๋ฐ ์์๋ JIT ์ปดํ์ผ์, ๋ฐฐํฌ ์์๋ AOT ์ปดํ์ผ์ ์ฌ์ฉํ๋ค. AOT ์ปดํ์ผ์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณํํ์ฌ ๋น ๋ฅธ ์คํ ์๋๋ฅผ ์ ๊ณตํ๋ค.
4.3 ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ฐ๋น์ง ์ปฌ๋ ์
Dart๋ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ ๋ฆฌํ๋ค.
4.4 ๋น๋๊ธฐ ์คํ ๋ชจ๋ธ
Dart๋ ์ด๋ฒคํธ ๋ฃจํ ๊ธฐ๋ฐ์ ๋น๋๊ธฐ ์คํ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค. ์ด๋ฅผ ํตํด ํจ์จ์ ์ธ I/O ์ฒ๋ฆฌ์ UI ๋ฐ์์ฑ์ ์ ๊ณตํ๋ค.