[G1-Sync] Manual knowledge update
This commit is contained in:
+166
-15
@@ -1,24 +1,175 @@
|
||||
---
|
||||
category: Frontend
|
||||
tags: [auto-wikified, technical-documentation, frontend]
|
||||
id: wiki-2026-0508-dart
|
||||
title: Dart
|
||||
description: "Dart는 구글이 개발한 정적 타입 기반의 객체 지향 프로그래밍 언어로, 주로 크로스 플랫폼 프레임워크인 Flutter의 기반 언어로 사용됩니다 [1, 2]."
|
||||
last_updated: 2026-05-04
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [Dart language, dart-lang]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
verification_status: applied
|
||||
tags: [dart, flutter, language, aot, jit]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
tech_stack:
|
||||
language: dart
|
||||
framework: flutter
|
||||
---
|
||||
|
||||
# Dart
|
||||
|
||||
## 📌 Brief Summary
|
||||
Dart는 구글이 개발한 정적 타입 기반의 객체 지향 프로그래밍 언어로, 주로 크로스 플랫폼 프레임워크인 Flutter의 기반 언어로 사용됩니다 [1, 2]. 클라이언트 환경에 최적화되어 있으며 기계어(ARM 코드)로 직접 컴파일되어 빠른 앱 실행과 높은 성능을 제공하는 것이 특징입니다 [2-4]. Java, C# 등 기존 객체 지향 언어와 유사한 문법을 가져 해당 언어 경험이 있는 개발자들에게는 학습이 비교적 수월한 편입니다 [5].
|
||||
## 매 한 줄
|
||||
> **"매 client-optimized language — JIT(dev) + AOT(prod) dual compile, sound null safety, isolate concurrency"**. 매 Google 의 Flutter 전용으로 설계 (2011→2018 pivot). 매 Dart 3.3+ (2024-2026) 의 records, patterns, sealed class 의 modern type system 도입.
|
||||
|
||||
## 📖 Core Content
|
||||
* **언어 아키텍처 및 성능 최적화:** Dart는 가비지 컬렉션(Garbage Collection)과 강력한 비동기(Async) 처리를 지원하며, AOT(Ahead-of-Time)와 JIT(Just-in-Time) 컴파일 방식을 모두 제공합니다 [6, 7]. 특히 모바일 환경에서는 AOT 컴파일을 통해 네이티브 ARM 코드로 변환되므로 애플리케이션의 콜드 스타트(Cold Start) 속도가 매우 빠릅니다 [4, 8].
|
||||
* **정적 타입 시스템과 최신 문법:** Dart는 정적 타입(Static Type) 시스템을 사용하여 개발 단계 및 컴파일 타임에 오류를 사전에 포착함으로써 애플리케이션을 더 안정적이고 예측 가능하게 만듭니다 [9]. Dart 3 버전에 이르러서는 기본적으로 견고한 널 안전성(Sound Null Safety)을 지원하며, 봉인 클래스(Sealed Classes), 패턴 매칭, 레코드(Records)를 비롯하여 와일드카드 변수, 널 인지 컬렉션 요소 등의 최신 언어 기능을 도입하여 코드의 견고함과 표현력을 더욱 향상시켰습니다 [10, 11].
|
||||
* **Flutter 생태계와의 결합 및 상호 운용성:** Dart는 Flutter 엔진(Skia 또는 Impeller)을 구동하는 핵심으로, 네이티브에 근접한 수준의 애플리케이션 성능과 고도의 커스텀 UI 제어를 가능하게 합니다 [7, 11]. 또한 성능이 중요한 작업이 필요할 경우, Dart FFI(Foreign Function Interface)를 통해 C 언어 라이브러리를 직접 호출하여 통신할 수 있는 상호 운용성도 제공합니다 [12, 13].
|
||||
## 매 핵심
|
||||
|
||||
## ⚖️ Trade-offs & Caveats
|
||||
* **제한적인 인재 풀 및 높은 채용/교육 비용:** JavaScript 등 주류 언어에 비해 Dart를 다루는 개발자(전체 개발자의 약 25% 수준)가 제한적이어서 특화된 인재 확보가 다소 어렵습니다 [14, 15]. 이로 인해 채용 시 10~15%의 급여 프리미엄이 발생하거나, 기존 개발자를 교육하여 프로젝트에 투입하는 데 적지 않은 시간과 비용($8,000~$12,000 상당)이 요구될 수 있습니다 [14, 16].
|
||||
* **상대적으로 작은 커뮤니티 규모:** 널리 사용되는 JavaScript 생태계에 비해 커뮤니티 규모가 작기 때문에, 스택 오버플로우나 기술 블로그 등에서 문제 해결을 위한 참고 자료나 코드 리뷰를 얻을 기회가 적을 수 있습니다 [6, 17]. 이는 기존에 Dart를 다뤄보지 않은 웹 기반 개발팀이 진입할 때 초기 학습 곡선을 가파르게 만드는 원인이 됩니다 [6, 18].
|
||||
### 매 dual compilation
|
||||
- **JIT (development)**: 매 hot reload < 1s — Flutter dev 의 핵심.
|
||||
- **AOT (production)**: 매 native machine code — startup 빠름, deterministic perf.
|
||||
- **dart2js / dart2wasm**: 매 web target — Flutter Web 의 binary.
|
||||
|
||||
---
|
||||
*Last updated: 2026-05-03*
|
||||
### 매 sound null safety (since 2.12)
|
||||
- 매 `String?` (nullable) vs `String` (non-null) 의 compile-time 보장.
|
||||
- 매 `late` keyword — 매 deferred init.
|
||||
- 매 `!` (bang) — 매 명시적 unwrap.
|
||||
|
||||
### 매 Dart 3 의 modern features
|
||||
- **Records**: `(int, String)` lightweight tuple.
|
||||
- **Patterns**: destructuring + switch expression.
|
||||
- **Sealed classes**: 매 exhaustive matching.
|
||||
- **Class modifiers**: `final`, `interface`, `base`, `sealed`.
|
||||
|
||||
### 매 isolate concurrency
|
||||
- 매 single-threaded event loop per isolate.
|
||||
- 매 message-passing (no shared memory).
|
||||
- 매 `Isolate.run()` (Dart 2.19+) 의 simple offload.
|
||||
|
||||
## 💻 패턴
|
||||
|
||||
### Null safety + late
|
||||
```dart
|
||||
class User {
|
||||
final String name;
|
||||
final String? nickname; // nullable
|
||||
late final int age; // deferred init
|
||||
|
||||
User(this.name, {this.nickname});
|
||||
|
||||
void setAge(int a) => age = a;
|
||||
}
|
||||
|
||||
final u = User('Yuna');
|
||||
print(u.nickname?.toUpperCase() ?? 'NO NICK');
|
||||
```
|
||||
|
||||
### Records (Dart 3)
|
||||
```dart
|
||||
(double, double) toPolar(double x, double y) =>
|
||||
(sqrt(x * x + y * y), atan2(y, x));
|
||||
|
||||
final (r, theta) = toPolar(3, 4);
|
||||
print('r=$r, θ=$theta');
|
||||
|
||||
// Named record
|
||||
({String name, int age}) profile = (name: 'Yuna', age: 28);
|
||||
print(profile.name);
|
||||
```
|
||||
|
||||
### Patterns + switch expression
|
||||
```dart
|
||||
sealed class Shape {}
|
||||
class Circle extends Shape { final double r; Circle(this.r); }
|
||||
class Square extends Shape { final double s; Square(this.s); }
|
||||
|
||||
double area(Shape sh) => switch (sh) {
|
||||
Circle(:final r) => 3.14159 * r * r,
|
||||
Square(:final s) => s * s,
|
||||
};
|
||||
```
|
||||
|
||||
### Async/await + Future
|
||||
```dart
|
||||
Future<User> fetchUser(int id) async {
|
||||
final res = await http.get(Uri.parse('https://api/u/$id'));
|
||||
if (res.statusCode != 200) throw Exception('fail');
|
||||
return User.fromJson(jsonDecode(res.body));
|
||||
}
|
||||
|
||||
// Stream — 매 multiple async value
|
||||
Stream<int> count(int n) async* {
|
||||
for (var i = 0; i < n; i++) {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
yield i;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Isolate (compute)
|
||||
```dart
|
||||
import 'dart:isolate';
|
||||
|
||||
Future<int> heavyCompute(List<int> data) =>
|
||||
Isolate.run(() => data.fold(0, (a, b) => a + b * b));
|
||||
|
||||
// 매 main isolate 의 block 없이 background work
|
||||
final sum = await heavyCompute(List.generate(1_000_000, (i) => i));
|
||||
```
|
||||
|
||||
### Extension methods
|
||||
```dart
|
||||
extension StringX on String {
|
||||
String get capitalized => isEmpty ? this : '${this[0].toUpperCase()}${substring(1)}';
|
||||
}
|
||||
|
||||
print('hello'.capitalized); // "Hello"
|
||||
```
|
||||
|
||||
### Mixin
|
||||
```dart
|
||||
mixin Loggable {
|
||||
void log(String msg) => print('[${runtimeType}] $msg');
|
||||
}
|
||||
|
||||
class Service with Loggable {
|
||||
void doWork() => log('working...');
|
||||
}
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| 매 Flutter mobile/desktop app | Dart (의무) |
|
||||
| 매 CLI tool (cross-platform) | Dart AOT compile |
|
||||
| 매 backend (Aqueduct/Shelf) | 매 가능 — 매 ecosystem 작음 |
|
||||
| 매 web (no Flutter) | 매 비추천 — TS/JS 우세 |
|
||||
|
||||
**기본값**: 매 Flutter context 에서만 Dart 의 사용 — 매 standalone 은 Go/Rust/TS 의 권장.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[Flutter]]
|
||||
- 변형: [[Flutter_AOT_Compilation_Dart]] · [[Dart_FFI_Foreign_Function_Interface]]
|
||||
- 응용: [[Flutter_Web_-_Desktop]] · [[Flutter_Impeller]]
|
||||
- Adjacent: [[TypeScript_Type_Safety]] · [[Cross-platform_Mobile_Development_Frameworks]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 매 Flutter widget tree 작성, 매 isolate 기반 background work, 매 records/patterns 활용 의 modern Dart.
|
||||
**언제 X**: 매 Flutter 외부 — 매 다른 ecosystem 에서 Dart 의 사용 의 의미 X.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **매 dynamic 의 남용**: 매 type system 의 우회 — 매 sound null safety 의 무력화.
|
||||
- **매 sync await chain**: 매 Future.wait 의 미사용 — 매 serialized 대기.
|
||||
- **매 isolate 와 closure**: 매 capture-by-reference 의 함정 (sendable 만 가능).
|
||||
- **매 print debug**: 매 debugPrint / logger 의 권장.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (dart.dev language tour, Dart 3.3 release 2024, Flutter 3.27).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — Dart 3 records/patterns/sealed 정리 |
|
||||
|
||||
Reference in New Issue
Block a user