class Album {
final int userId;
final int id;
final String title;
Album({this.userId, this.id, this.title});
factory Album.fromJson(Map<String, dynamic> json) {
return Album(
userId: json['userId'],
id: json['id'],
title: json['title'],
);
}
}
json 파싱할 때 보통 위 예제처럼 factory 생성자를 사용한다.
factory 생성자는 인터넷에 조금만 찾아도 "이미 생성된 인스턴스를 재활용하는 생성자" 라고 알고 있을 것이다.
위 예제는 사실상 factory 생성자를 굳이 안 써도 된다고 한다.
factory 생성자를 json 파싱할때만 본 나는 의문이 떠올랐고 factory 생성자에 대한 본질을 이 포스팅에서 다루어 볼 것이다.
dart 공식문서에 따르면 factory 생성자에 대한 설명은 다음과 같다.
⭐️ 클래스의 새 인스턴스를 항상 생성하지 않는 생성자를 구현할 때 Factory 키워드를 사용하세요. 예를 들어, 팩토리 생성자는 캐시에서 인스턴스를 반환하거나 하위 유형의 인스턴스를 반환할 수 있습니다.
↑
첫 줄을 보면 factory 키워드는 새로운 인스턴스를 항상 만들지 않는 생성자를 구현할 때 사용한다고 한다.
근데 이후의 설명도 굉장히 중요하다.
⭐️ 팩토리 생성자의 또 다른 사용 사례는 초기화 목록에서 처리할 수 없는 논리를 사용하여 최종 변수를 초기화하는 것입니다.
다시 돌아와서 보자.
예제를 조금 바꿔보겠다.
만약 Album json 파싱을 하려고 하는데 이때 title 이 null 로 들어 올 가능성이 있다면?
title 이 null 일 경우 '제목 없음' 으로 보여주고 싶다면 어떻게 해야될까?
물론 위젯 내의 코드에서 다음과 같이 설정해줄 수도 있다.
title == null ? '제목 없음' : title
하지만 아예 Album 객체를 만들 때부터 title 이 null 일 때 '제목 없음' 으로 바꿔주는 방법이 있다.
class Album {
final int userId;
final int id;
final String title;
Album({this.userId, this.id, this.title});
factory Album.fromJson(Map<String, dynamic> json) {
return Album(
userId: json['userId'],
id: json['id'],
title: json['title'] ?? '제목 없음', // 여기를 수정!
);
}
}
이렇게 설정해주면 위젯 내의 코드에서 조건식을 쓰지 않고도 title 을 쓸 수 있다.
즉 내가 말하고 싶은건 json 파싱할 때의 factory 생성자는 싱글턴 패턴을 사용하는 것이라기보다 보통 객체를 초기화할 때 어떤 로직을 적용할 수 있다는 것이다. 이것을 통해 우리는 좀 더 편하게 개발이 가능해진다!
인터넷을 찾아보면 factory 생성자를 보통 싱글턴 패턴으로 사용하는 것에 주목하는 것 같은데 객체 초기화 시, 좀 더 편리한 기능이 있다는 이 부분을 주목하지 않은 것 같다는 생각이 들었다.
다음에는 factory 생성자에 대한 고찰2 로 돌아와서 좀 더 자세히 factory 생성자에 대해서 알아보겠다.
'🐦 Flutter' 카테고리의 다른 글
[Flutter] InheritedWidget 에 대한 고찰 1 - BuildContext.dependentOnInhheritedWidgetOfExactType (0) | 2023.10.14 |
---|---|
factory 생성자에 대한 고찰2 - 일반 생성자와 다른 차이점 (0) | 2023.09.23 |
[Dart] mixin (0) | 2023.04.09 |
AES-256 암호화 (5) | 2023.04.01 |
[Flutter] RenderFlex children have non-zero flex but incoming height constraints are unbounded (1) | 2023.02.03 |