[Dart] Dart의 factory 키워드를 알아보자!
이번 포스팅에서는 Dart Factory Constructor에 대해 알아보겠습니다.
factory
dart의 factory 키워드는 flutter에서 모델 클래스를 만들 때 자주 사용되는 예약어입니다.
JSON 직렬화 예제 코드와 함께 factory를 알아보겠습니다.
// build runner에게 Human 클래스가 JSON 직렬화 로직이 구성되어야 한다고 미리 선언하는 어노테이션입니다.
@JsonSerializable
Class Human {
final String gender;
final String age;
final String name;
Human({required this.gender, required this.age, required this.name});
// Map에서 새로운 Human 인스턴스를 생성하기 위해 필요한 팩토리 생성자입니다.
// build runner를 통해 생성된 _$HumanFromJson() 생성자에게 Map을 전달합니다.
factory Human.fromJson(Map<String, dynamic> json) => _$HumanFromJson(json);
// toJson은 클래스가 JSON 인코딩의 지원을 선언하는 규칙입니다.
Map<String, dynamic> toJson() => _$HumanToJson(this);
}
위의 코드 작업을 통해 runner는 인코딩을 위한 코드와 JSON으로 부터 필드값을 디코딩하는 코드를 생성해줍니다.
( 만약 lowerCamelCase를 사용하고 싶다면 @JsonKey 어노테이션을 사용할 수 있습니다. )
@JsonKey(name: 'registration_date_millis')
factory에 대한 Dart 공식문서의 설명입니다.
Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class
새로운 인스턴스를 생성하지 않는 생성자를 구현할 때 factory 키워드를 사용 권장합니다.
따라서 factory는 디자인 패턴 중 '싱글톤 패턴'을 따르는 것입니다.
앞선 Json 직렬화 예제를 통해 factory 키워드로 새로운 인스턴스를 생성하는 것이 아닌 하나의 객체만 사용하는 것입니다.
factory의 특징
매번 인스턴스를 새롭게 생성하는 constructor와 다르게 factory에는 몇가지 특징이 있습니다.
기존에 이미 생성된 인스턴스가 있다면 반환하여 재사용합니다.
하나의 클래스에서 하나의 인스턴스만 생성합니다.
( 싱글톤 패턴 )
서브 클래스 인스턴스를 반환할 때 사용할 수 있습니다.
factory constructors에서는 this에 접근할 수 없습니다.
따라서 factory가 공장이라는 해석 때문에 인스턴스를 찍어내는 공장이라고 착각하기 쉽습니다.
하지만 사용하다보면 창고의 의미에 더 가깝습니다.
( 필요에 의해 호출하여 기존의 인스턴스를 반환받아 사용하기 때문에 )
factory와 하위 클래스
factory는 서브 클래스의 인스턴스를 반환할 때도 사용할 수 있습니다.
class Human {
final String gender;
final String age;
final String name;
Human.name(String name) : this(name : name);
factory Human.name(String name){
return Man(name);
}
}
class Man extands Human {
Man(String name) : super(name : name);
}
상위 객체에서 하위 객체 인스턴스를 안다는게 어색하지만 Human 클래스에서 Man 클래스의 인스턴스를 반환할 수 있게되었습니다.
예제 코드의 Dart 공식 문서입니다.
JSON and serialization : https://docs.flutter.dev/development/data-and-backend/json
factory constructor : https://dart.dev/guides/language/language-tour#factory-constructors