관리 메뉴

Bull

[Flutter] factory 생성자 (.fromJson) 본문

Software Framework/Flutter

[Flutter] factory 생성자 (.fromJson)

Bull_ 2024. 1. 20. 00:26

 

사용 이유

만들고 있는 앱 중, 데이터를 로컬에 저장시키기 위해 인스턴스를 JSON 형태로 직렬화 하고 이를 문자열로 변환하여  shared_preferences 패키지의 클래스에 저장한다. 이를 다시 데이터로 읽을 때, 문자열을 JSON형태로 변환하고 다시 객체로 역직렬화를 시킨다.

 

그 중,  문자열을 JSON 형태로 변환된 상태를 객체로 역질렬화 시킬 때  factory 키워드 중 (객체).fromJson이 사용된다.

 

 

 

적용 예시 (.fromJson)

import 'dart:convert';

class SongInfo {
  String song;
  String artist;
  String number;
  bool isTJ;
  bool isKY;

  SongInfo({required this.song, required this.artist, required this.number, this.isTJ = false, this.isKY = false});

  // JSON으로 객체를 변환하는 메서드
  Map<String, dynamic> toJson() {
    return {
      'song': song,
      'artist': artist,
      'number': number,
      'isTJ': isTJ,
      'isKY': isKY,
    };
  }

  // JSON에서 객체로 변환하는 팩토리 생성자
  factory SongInfo.fromJson(Map<String, dynamic> json) {
    return SongInfo(
      song: json['song'],
      artist: json['artist'],
      number: json['number'],
      isTJ: json['isTJ'],
      isKY: json['isKY'],
    );
  }
}

 

나의 프로젝트 중 데이터 인스턴스를 생성하는 코드 중 일부이다.

 

 

일반적인 factory 키워드는?

보통 객체를 생성할 때 간단하게 new 키워드를 사용하여 새로운 인스턴스를 만든다. 그런데 factory 생성자를 사용하면 조금 다른 방식으로 객체를 만들 수 있다.

 

기본 생성자와 차이점은 일반적인 생성자는 클래스의 새 인스턴스를 만들 때마다 호출된다. 즉, new MyClass()를 호출할 때 마다 MyClasss의 새로운 객체가 메모리에 생성된다. 하지만 factory 생성자는 새 객체를 만들 수도 있고 이미 만들어진 객체를 재사용할 수 있다.

 

factory 생성자 사용의 싱글톤 패턴을 예

class Singleton {
  static Singleton? _instance;

  // Private constructor
  Singleton._privateConstructor();

  // The factory constructor
  factory Singleton() {
    if (_instance == null) {
      _instance = Singleton._privateConstructor();
    }
    return _instance!;
  }
}

 

위 싱클톤 클래스는    Singleton._privateConstructor();  를  통해 외부에서 직접 인스턴스를 생성할 수 없게 한다.

대신, factory 생성자 Singleton()을 통해 객체를 요청하면 _instance를 확인하고 이미 있다면 기존의 것을 반환해준다.

 

장점

- 같은 객체를 여러 번 만들 필요가 없으니 메모리를  효율적으로 사용할 수 있다.

- 객체 생성을 더 세밀하게 제어할 수 있다.

단점

코드가 더 복잡해질 수 있고, 생성자의 동작 방식을 잘 알고 있어야 한다.

 

 

결론

factory 생성자는 이미 있는 인스턴스를 재사용할 수 있도록 해주는 것이다.
.fromJson과 같이 특별한 로직이 필요할 경우 사용한다.