FrontEnd/Flutter

[Flutter] Dart ๊ธฐ์ดˆ

ddonghyeo 2024. 10. 14. 00:48

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 ๋ฐ˜์‘์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.