factory

shin·2023년 1월 29일
0

Dart

목록 보기
20/20
void main(){
  final perant = Parent(id: 1);
  
  print(perant.id);
  
  final child = Child(id: 3);
  
  print(child.id);
}

class Parent{
  final int id;
  
  Parent({
    required this.id,
  });
  
}

class Child extends Parent{
  
  Child({
    required super.id,
  });
}
  • Parent 클래스와 Parent를 상속하고 있는 child클래스를 생성해서 인스턴스화하고 각각 id에 값을 넣어줬다.
  • 각각 print하면 1, 3을 반환하게 된다.

Factory constructor 사용

void main(){
  final perant = Parent(id: 1);
  
  print(perant.id);
  
  final child = Child(id: 3);
  
  print(child.id);
  
  final parent2 = Parent.fromInt(5);
  
  print(parent2.id);
}

class Parent{
  final int id;
  
  Parent({
    required this.id,
  });
  
  factory Parent.fromInt(int id){
    return Parent(id: id);
  }
}

class Child extends Parent{
  
  Child({
    required super.id,
  });
}

1
3
5
  • factory에 일반 생성자를 생성하듯이 사용하면 된다.
  • 일반 생성자와 다른점이라면 (){} 함수 body가 있다.
  • 현재 class의 인스턴스를 반환해줘야 한다. 위에 경우를 보면 Parent를 반환해줘야 한다.
  • factory Parent 생성자와 Parent 클래스 생성자 이름이 같아 에러가 발생한다. 이때 named constructor를 사용해서 fromInt를 작성해준다.
  • Factory constructor를 선언해서 사용해보면 5가 출력된다.
final parent2 = Parent.fromInt(5);
  
  print(parent2.id);
  
  5

특징

  • 현재 클래스만 인스턴스해서 반환해준다. Parent를 선언했는데 Child가 반환되거나 Child를 선언했는데 Parent가 반환되는 일은 없다.
  • 하지만 Factory constructor에서는 자식 클래스인 Child를 반환해도 상관이 없다.
void main(){
  final perant = Parent(id: 1);
  
  print(perant.id);
  
  final child = Child(id: 3);
  
  print(child.id);
  
  final parent2 = Parent.fromInt(5);
  
  print(parent2.id);
}

class Parent{
  final int id;
  
  Parent({
    required this.id,
  });
  
  factory Parent.fromInt(int id){
    return Child(id: id); // Parent에서 자식클래스인 Child로 변경했다.
  }
}

class Child extends Parent{
  
  Child({
    required super.id,
  });
}

1
3
5
  • 출력해보면 이전과 결과값의 변동이 없다.
  • parent2의 타입을 출력해보면 Child가 나오는 것을 볼 수 있다.
print(parent2);

Instance of 'Child'
  • 따라서 factory constructor를 사용하게 되면 현재 클래스를 반환하는 것은 물론 현재 클래스를 상속하고 있는 클래스를 인스턴스화해서 반환할 수 있다.

0개의 댓글