[Dart] 생성자

GH lee·2023년 5월 6일
0

Dart/Flutter

목록 보기
2/12
post-thumbnail

생성자 정리

기본생성자

class Person{
  String? name;
  String? age;

  // java의 생성자와 같은 형태 
  Person(String name, String age){
    this.name = name;
    this.age = age;
  }

  // 이렇게 짧게 만들수 있음
  Person(this.name, this.age);
}

기본생성자는 Person(’name’, ‘age’)로 순서를 지켜줘야하는 불편함이 있음

Named Parameter

class Person{
  String? name;
  String? age;

	Person({this.name, this.age});
}

// 중괄호로 감싸면 이렇게 필드 이름을 지정해서 생성함
class PersonGenerator {
  Person p = Person(name: 'name', age: 'age');
}

순서를 지킬 필요가 없고 어떤 필드에 어떤 값을 넣는지 한눈에 보기가 편함

Named Constructor

class Person{
  String? name;
  String? age;

  Person.init(this.name, this.age);
}

class PersonGenerator {
  Person p = Person.init('name', 'age');
}

생성자에 .init()과 같이 이름을 지정하여 다양한 생성자를 만들수 있음
주로 .fromJson()같은 경우에 사용
슈퍼클래스의 Named Constructor는 서브클래스에 상속되지 않음

Initializer List

class Person {
  String? name;
  String? age;

  Person.fromJson(Map<String, dynamic> map)
      : name = map['name'],
        age = map['age'];
}

class PersonGenerator {
  final Map<String, dynamic> map = {
    "name": "name",
    "age": "age",
  };
  PersonGenerator(){
    Person p = Person.fromJson(map);
  }
}

생성자의 body {}안의 코드가 실행되기 전에 파라미터로 받은 값들로 필드를 초기화 해줄때 사용

factory constructor

class Person {
  String? name;
  String? age;

  Person.fromJson(Map<String, dynamic> map)
      : name = map['name'],
        age = map['age'];
  
  factory Person.factory(Map<String, dynamic> map){
       return Person.fromJson(map);
  }
    
}

class PersonGenerator {
  final Map<String, dynamic> map = {
    "name": "name",
    "age": "age",
  };
  PersonGenerator(){
    Person p = Person.factory(map);
  }
}

Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class. Another use case for factory constructors is initializing a final variable using logic that can’t be handled in the initializer list.
- 공식문서

  • factory라고 붙어있어 factory 패턴이라고 착각할 수 있으나 사실은 싱글톤 패턴을 구현하기 위한 생성자이다
  • factory만 붙인다고 싱글톤이 되는건 아니고 직접 싱글톤으로 구현해야함
  • 위 코드는 factory생성자를 이용해 final 변수를 초기화하기 위해 사용한 코드임
  • 공식문서의 예제 코드를 확인해보자 https://dart.dev/language/constructors#factory-constructors
  • factory 생성자에서는 this에 접근할 수 없다
  • factory 생성자는 자식객체의 인스턴스를 반환할 수도 있다
class Person {
  String? name;
  String? age;
  
  Person(this.name, this.age);

  Person.fromJson(Map<String, dynamic> map)
      : name = map['name'],
        age = map['age'];
  
  factory Person.factory(Map<String, dynamic> map){
       return Person.fromJson(map);
  }
  
  factory Person.man(Map<String, dynamic> map){
    return Man(map['name'], map['age']);
  }
    
}

class Man extends Person{
    Man(String name, String age) : super(name, age);
}
main(){
  final Map<String, dynamic> map = {
    "name": "name",
    "age": "age",
  };
  
  Person p1 = Person.man(map);
  print(p1);
  
  Person p2 = Person.factory(map);
  print(p2);
  
}

출력결과

Instance of 'Man'
Instance of 'Person'

profile
Flutter Junior

0개의 댓글

관련 채용 정보