Introduction to Dart
Client-optimized programming language by Google
Dart is Google's foundation language for Flutter, enabling iOS, Android, Web, and Desktop apps from a single codebase. It is a class-based OOP language with type inference, Null Safety, JIT compilation for Hot Reload, and AOT compilation for native performance.
Dartλ 무μμΈκ°?
Dartλ Googleμμ κ°λ°ν ν΄λΌμ΄μΈνΈ μ΅μ ν νλ‘κ·Έλλ° μΈμ΄λ‘, λͺ¨λ νλ«νΌμμ λΉ λ₯΄κ³ μμ μ μΈ μ ν리μΌμ΄μ μ κ°λ°νκΈ° μν΄ μ€κ³λμμ΅λλ€. Flutter νλ μμν¬μ κΈ°λ° μΈμ΄μ΄λ©°, νλμ μ½λλ² μ΄μ€λ‘ iOS, Android, Web, Desktop μ±μ λ§λ€ μ μκ² ν΄μ€λλ€.
Dartμ μμ¬
| μ°λ | μ΄λ²€νΈ |
|---|---|
| 2011 | Google I/Oμμ Dart νλ‘μ νΈ λ°ν |
| 2013 | Dart 1.0 μ μ μΆμ |
| 2018 | Dart 2.0 β νμ μμ μ± λν κ°ν |
| 2021 | Dart 2.13 β Null Safety μμ ν |
| 2023 | Dart 3.0 β Records, ν¨ν΄ λ§€μΉ λμ |
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° μμ
Dartλ ν΄λμ€ κΈ°λ° κ°μ²΄ μ§ν₯ μΈμ΄μ
λλ€. μλ μμ μμ μμ±μ μΆμ½ λ¬Έλ²(this.name)κ³Ό λ¬Έμμ΄ λ³΄κ°($name)μ νμΈν μ μμ΅λλ€.
class Person {
String name;
int age;
Person(this.name, this.age);
void introduce() {
print('μλ
νμΈμ, μ λ $nameμ΄κ³ $ageμ΄μ
λλ€.');
}
}
void main() {
final person = Person('νκΈΈλ', 30);
person.introduce();
}
νμ μμ€ν β λͺ μμ νμ vs νμ μΆλ‘
Dartλ μ μ νμ
μΈμ΄μ΄λ©΄μλ var ν€μλλ‘ νμ
μΆλ‘ μ μ§μν©λλ€. finalμ ν λ²λ§ ν λΉ κ°λ₯ν λ°νμ μμμ
λλ€.
// λͺ
μμ νμ
μ§μ
String name = 'νκΈΈλ';
int age = 30;
// νμ
μΆλ‘ (var, final)
var name = 'νκΈΈλ'; // StringμΌλ‘ μλ μΆλ‘
var age = 30; // intλ‘ μλ μΆλ‘
final height = 175.5; // double, μ¬ν λΉ λΆκ°
Null Safety
Dart 2.12λΆν° λμ
λ Null Safetyλ null κ΄λ ¨ λ°νμ μλ¬λ₯Ό μ»΄νμΌ νμμ λ°©μ§ν©λλ€. ?λ₯Ό λΆμ΄λ©΄ nullable, λΆμ΄μ§ μμΌλ©΄ non-nullable νμ
μ
λλ€.
// Non-nullable β null ν λΉ λΆκ°
String name = 'νκΈΈλ';
// Nullable β null ν λΉ κ°λ₯
String? nullableName = 'νκΈΈλ';
nullableName = null; // OK
⚠ Null Safety μ°μ°μ μ 리
?.β μ‘°κ±΄λΆ μ κ·Ό (nullμ΄λ©΄ null λ°ν)??β null λ³ν© (nullμ΄λ©΄ κΈ°λ³Έκ° μ¬μ©)!β non-null λ¨μΈ (μν, λ°νμ μλ¬ κ°λ₯)??=β nullμ΄λ©΄ ν λΉ
λΉλκΈ° νλ‘κ·Έλλ° (async/await)
Dartλ Futureμ async/awaitλ₯Ό κΈ°λ³Έ μ§μνμ¬ λΉλκΈ° μμ
μ λκΈ° μ½λμ²λΌ κΉλνκ² μμ±ν μ μμ΅λλ€.
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return 'λ°μ΄ν°';
}
void main() async {
print('λ°μ΄ν° μμ² μμ');
final data = await fetchData();
print('λ°μ λ°μ΄ν°: $data');
}
Dart μ€ν νκ²½
Dartλ λ€μν μ€ν νκ²½μ μ§μνλ©°, μν©μ λ°λΌ μ ν©ν μ»΄νμΌ λ°©μμ μ νν μ μμ΅λλ€.
| νκ²½ | λͺ λ Ήμ΄ | μ€λͺ |
|---|---|---|
| Dart VM | dart run main.dart | JIT μ»΄νμΌ, κ°λ° μ μ¬μ© |
| Flutter | flutter run | λͺ¨λ°μΌ/λ°μ€ν¬ν±/μΉ μ± μ€ν |
| Web (JS) | dart compile js main.dart -o main.js | JavaScriptλ‘ λ³ν |
| Native AOT | dart compile exe main.dart -o main | λ€μ΄ν°λΈ λ°μ΄λ리 μμ± |
λ€λ₯Έ μΈμ΄μ λΉκ΅
Java vs Dart β Dartλ μμ±μ μΆμ½κ³Ό λ¬Έμμ΄ λ³΄κ°μΌλ‘ μ½λκ° ν¨μ¬ κ°κ²°ν©λλ€.
// Dart β Javaλ³΄λ€ κ°κ²°ν ν΄λμ€ μ μ
class Person {
String name;
int age;
Person(this.name, this.age); // μμ±μ μΆμ½
void sayHello() {
print('Hello, I am $name'); // λ¬Έμμ΄ λ³΄κ°
}
}
JavaScript vs Dart β ν¨μν μ€νμΌ(map, filter λ±)μ μ μ¬νκ² μ§μνλ©΄μ νμ μμ μ±μ μ 곡ν©λλ€.
void main() {
final list = [1, 2, 3, 4, 5];
final doubled = list.map((item) => item * 2).toList();
print(doubled); // [2, 4, 6, 8, 10]
}
Swift vs Dart β Named parameterμ optional νμ λ± Swiftμ μ μ¬ν λ¬Έλ²μ κ°μ§λλ€.
class Person {
String name;
int? age; // nullable (Swiftμ Optionalκ³Ό μ μ¬)
Person(this.name, {this.age}); // named parameter
}
ν¨ν€μ§ κ΄λ¦¬ (pub)
pubspec.yamlμ μμ‘΄μ±μ μΆκ°νκ³ dart pub getμΌλ‘ μ€μΉν©λλ€. pub.devμμ μμ² κ°μ ν¨ν€μ§λ₯Ό νμν μ μμ΅λλ€.
# pubspec.yaml
dependencies:
http: ^1.0.0
path: ^1.8.0
$ dart pub get
κ°λ° νκ²½ μ€μ
-
✓
1λ¨κ³ β Dart SDK μ€μΉ (Flutter SDKμ ν¬ν¨λμ΄ μμ)
-
✓
2λ¨κ³ β VS Code μ€μΉ λ° Dart νμ₯(extension) μΆκ°
-
✓
3λ¨κ³ β νλ‘μ νΈ μμ±:
dart create my_dart_project -
✓
4λ¨κ³ β VS Codeμμ νλ‘μ νΈ μ΄κΈ° β F5 λλ Run λ²νΌμΌλ‘ μ€ν
Dartμ ν΅μ¬ μ₯μ μμ½
- ✓ λ¨μΌ μ½λλ² μ΄μ€λ‘ 6κ° νλ«νΌ(iOS, Android, Web, macOS, Windows, Linux) κ°λ°
- ✓ Hot Reloadλ‘ κ°λ° μμ°μ± κ·Ήλν (JIT μ»΄νμΌ)
- ✓ AOT μ»΄νμΌλ‘ λ€μ΄ν°λΈ μμ€μ μ±λ₯ λ¬μ±
- ✓ κ°λ ₯ν νμ μμ€ν + Null Safetyλ‘ λ°νμ μλ¬ μ¬μ λ°©μ§
- ✓ νλΆν νμ€ λΌμ΄λΈλ¬λ¦¬μ pub.dev ν¨ν€μ§ μνκ³
Implementation Steps
Dart is statically typed with type inference β var name = 'Hong' auto-infers to String
Everything is an object β int, bool, functions, even null are all objects
Dual JIT (dev) + AOT (prod) compilation β fast dev with Hot Reload and native performance
Practice directly in browser with DartPad at dart.dev
Pros
- ✓ Single language for 6 platforms
- ✓ Rich standard library (collections, async, file I/O, HTTP)
Cons
- ✗ Smaller ecosystem compared to JS/TS
- ✗ Limited use outside Flutter