2023. 4. 3. 14:15ㆍ모바일어플개발/Flutter
안녕하세요~ totally 개발자입니다.
Factory Pattern (팩토리 패턴)
Factory는 싱글톤 패턴을 기반으로 하며 새로운 인스턴스를 만들지 않을 때 사용하는 생성자입니다. 이미 생성된 인스턴스(instance)가 있다면 생성하지 않고 그대로 return해서 재사용하고, 싱글톤 개념에 따라 단 한 개의 인스턴스만 생성합니다. Factory를 위해서는 싱글톤(Singleton) 패턴이 무엇인지 먼저 살펴볼 필요가 있습니다.
Singleton Pattern (싱글톤 패턴)
싱글톤 패턴이란 객체를 단 하나만 생성하여 어느 곳에서든지 이 생성된 단 하나의 객체를 참조할 수 있게 해주는 패턴입니다. 이것에 대한 장점은 당연히 여러 객체를 생성하지 않고 단 하나의 객체만 생성하여 관리하기 때문에 메모리 낭비를 줄일 수 있고 성능적인 부분에서도 도움을 주며 데이터의 공유도 비교적 쉽게 할 수 있습니다.
바로 예제를 통해 팩토리에 대해 자세히 살펴봅니다. (모든 소스 코드는 맨 아래에 첨부하였으니 참고하시기 바랍니다)
Step 1: 먼저 enum 형식으로 PersonJob를 선언해줍니다.
이 enum은 열거형이라는 뜻이며 분류를 쉽게 할 수 있도록 도와주는 역할을 하며 switch 구문과 아주 잘 어울리는 문법이라 할 수 있습니다.
Step 2: abstract(추상) Person 클래스를 선언하고 getName과 getJobName을 각각 String 값을 return 해줄 수 있는 메소드를 선언하여 줍니다. 이 추상 클래스는 하위 클래스가 implements하게 되며 추상 클래스에서 선언된 메소드를 재정의(overrides)하게 됩니다. 추상 클래스에 선언된 메소드는 말그대로 메소드의 이름과 타입만 정의해주시는 것이며 실제로 구현되는 부분들은 자식(child) 클래스에서 재정의하게 됩니다.
Step 3: Person를 implements하는 Student 클래스를 다음처럼 정의해줍니다.
Step 4: Developer 클래스도 정의해줍니다.
Step 5: static personFactory 부분 메소드를 추가해줍니다.
Step 6: main 함수를 아래처럼 작성해줍니다.
Step 7: dart Person.dart 하였을 때 아래처럼 나오면 성공입니다.
Step 8: 이번에는 factory 키워드를 사용해서 구현해보겠습니다.
여기에서 주의하실 부분은 factory 다음에는 Person 클래스 이름이 바로 오며, 위처럼 생성자 형태로 하셔도 되고 Person.personFactory 메소드 형태로 구현하셔도 됩니다. 그러나 13번째, 15번째 줄에 아까 작성했을 때에는 메소드를 리턴했지만 여기에서는 반드시 Person 클래스를 implements하는 클래스로 return해야 합니다.
Step 9: 메인 함수도 다음처럼 수정해줍니다. 여기에서는 바로 Person 생성자를 통해 구현했으나 메소드 형태로 가능합니다.
Step 10: factory를 제일 많이 보신 부분이 바로 아래 내용이라고 생각됩니다.
factory 키워드를 사용했기 때문에 return 타입으로는 반드시 클래스의 인스턴스가 return 되어야 하며 School 생성자로 선언하거나 위처럼 School.fromJson으로 구현할 수 있습니다. factory 개념에 따라 살펴보았는데 Singleton(싱글톤)이 무엇이며 왜 factory(팩토리)를 사용해야 하는지에 대해 조금이나마 이해가 되셨으리라 생각합니다. 감사합니다.
[전체 소스 코드]
[유튜브 강좌 영상]
'모바일어플개발 > Flutter' 카테고리의 다른 글
[050] 플러터 (Flutter) 배우기 - Rest API 사용(GET, POST) (0) | 2023.04.05 |
---|---|
[049] 플러터 (Flutter) 배우기 - Singleton (싱글톤) 개념 이해하기 (0) | 2023.04.04 |
[047] 플러터 (Flutter) 배우기 - Carousel Slider + Indicator (자동 슬라이더 + 인디케이터 구현) (2) | 2023.04.01 |
[046] 플러터 (Flutter) 배우기 - ListView.builder + 스크롤 Pagination 적용 (4) | 2023.03.30 |
[045] 플러터 (Flutter) 배우기 - Widget Test (위젯 테스트) (0) | 2023.03.21 |