Research
Dart Programming Language
Dart 핵심 문법과 실무에서 자주 쓰는 패턴을 빠르게 정리합니다.
Dart Programming Language
핵심 특징
- AOT/JIT 동시 지원: 개발 중에는 hot reload, 배포 시에는 빠른 실행 성능.
- Null safety 기본 적용: nullable/nonnull 타입이 컴파일 단계에서 구분됨.
- Flutter와의 높은 결합: UI 상태 모델링에 필요한 문법(immutable, extension, async)이 풍부함.
1) 변수와 Null Safety
void main() {
String name = "sayu"; // non-null
String? nickname = null; // nullable
if (nickname != null) {
print(nickname.toUpperCase());
}
print(nickname?.toUpperCase() ?? "NO_NICKNAME");
}
String에는null을 넣을 수 없음.String?는 null 가능, 사용 시?.,??, null check 필요.
2) 함수 시그니처
Named Parameter + Required
String formatUser({
required String id,
required int age,
String country = "KR",
}) {
return "$id:$age:$country";
}
Optional Positional Parameter
String greet(String name, [String suffix = "!"]) {
return "Hello $name$suffix";
}
Arrow Function
int add(int a, int b) => a + b;
3) 컬렉션
void main() {
final numbers = <int>[1, 2, 3];
final profile = <String, Object>{
"name": "sayu",
"active": true,
};
final tags = <String>{"dart", "flutter"};
final withCondition = [
"base",
if (numbers.isNotEmpty) "hasNumbers",
for (final n in numbers) "n=$n",
];
print(profile);
print(tags);
print(withCondition);
}
4) 클래스와 불변 모델
class User {
final String id;
final int age;
const User({required this.id, required this.age});
User copyWith({String? id, int? age}) {
return User(
id: id ?? this.id,
age: age ?? this.age,
);
}
}
실무에서는 final 필드 + copyWith 조합이 상태 업데이트에 가장 안정적입니다.
5) 비동기
Future<String> fetchUser() async {
await Future.delayed(const Duration(milliseconds: 100));
return "user-1";
}
Future<void> main() async {
final user = await fetchUser();
print(user);
}
Future<T>: 단일 비동기 결과.Stream<T>: 연속 이벤트 처리.
자주 나는 실수
- nullable 타입을 null check 없이 접근.
dynamic남용으로 컴파일 안전성 상실.const/final구분 없이 모두 가변으로 두는 설계.
요약
Dart는 null safety와 명확한 타입 시스템 덕분에 대규모 코드베이스에서 유지보수성이 좋습니다.
실무 기준으로는 required named parameter, immutable 모델, async/await 규칙화부터 먼저 잡는 것이 효과적입니다.