Flutter와 Dart 언어는 지속적으로 발전하고 있으며, 최근에는 Records, Pattern Matching, Macro 기능이 도입되었습니다. 이 세 가지 기능이 도입된 이유와 그 장점을 살펴보겠습니다.
Records는 여러 값을 한 번에 묶어서 다룰 수 있는 기능입니다. Dart에서는 기존에 여러 값을 묶기 위해 튜플 또는 사용자 정의 클래스를 사용해야 했지만, Records는 더 간결하고 효율적인 방법을 제공합니다.
class UserDetails {
final String name;
final int age;
final bool isActive;
UserDetails(this.name, this.age, this.isActive);
}
UserDetails getUserDetails() {
return UserDetails('Alice', 30, true);
}
void main() {
var userDetails = getUserDetails();
print('Name: ${userDetails.name}, Age: ${userDetails.age}, IsActive: ${userDetails.isActive}');
}
(String, int, bool) getUserDetails() {
return ('Alice', 30, true);
}
void main() {
var userDetails = getUserDetails();
print('Name: ${userDetails.$1}, Age: ${userDetails.$2}, IsActive: ${userDetails.$3}');
}
Pattern Matching은 값이나 객체의 구조를 검사하고 해체(deconstruct)하여 사용할 수 있게 하는 기능입니다. 이는 특히 복잡한 데이터 구조를 다룰 때 매우 유용합니다.
void handleResponse(int statusCode, String message) {
if (statusCode == 200) {
print('Success: $message');
} else if (statusCode == 404) {
print('Not Found');
} else {
print('Unknown response');
}
}
void main() {
var statusCode = 200;
var message = 'OK';
handleResponse(statusCode, message);
}
void handleResponse((int, String) response) {
switch (response) {
case (200, var message):
print('Success: $message');
break;
case (404, _):
print('Not Found');
break;
default:
print('Unknown response');
}
}
void main() {
var response = (200, 'OK');
handleResponse(response);
}
Macros는 코드 생성을 자동화하여 반복적인 작업을 줄이고, 코드의 유지 보수성을 높여줍니다. Dart에서는 아직 직접적인 Macros 기능이 없지만, 코드 생성 라이브러리를 통해 유사한 작업을 수행할 수 있습니다.
class User {
final String name;
final int age;
User(this.name, this.age);
factory User.fromJson(Map<String, dynamic> json) {
return User(
json['name'] as String,
json['age'] as int,
);
}
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
};
}
}
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
()
class User {
final String name;
final int age;
User(this.name, this.age);
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}