🐦 Flutter

factory 생성자에 대한 고찰1 - Json 파싱

ji-hyun 2023. 9. 21. 00:28
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 생성자에 대해서 알아보겠다.