Dart 소개
Google이 만든 클라이언트 최적화 프로그래밍 언어
Dart는 Google이 만든 Flutter의 기반 언어로, 하나의 코드베이스로 iOS, Android, Web, Desktop 앱을 모두 만들 수 있습니다. 클래스 기반의 객체 지향 언어이면서 타입 추론과 Null Safety를 지원하고, JIT 컴파일로 Hot Reload, AOT 컴파일로 네이티브 성능을 동시에 달성합니다.
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 패키지 생태계
구현 순서
Dart는 정적 타입 언어이면서 타입 추론을 지원한다 — var name = '홍길동'은 자동으로 String으로 추론
모든 것이 객체 — int, bool, 함수, null까지 전부 객체로 취급
JIT(개발) + AOT(배포) 이중 컴파일 — Hot Reload의 빠른 개발과 네이티브 성능을 동시에 달성
dart.dev에서 DartPad로 브라우저에서 바로 연습 가능
장점
- ✓ 단일 언어로 6개 플랫폼(iOS, Android, Web, macOS, Windows, Linux) 개발 가능
- ✓ 풍부한 표준 라이브러리 (컬렉션, 비동기, 파일 I/O, HTTP)
단점
- ✗ JavaScript/TypeScript 대비 생태계가 작음
- ✗ Flutter 이외의 사용처가 제한적