newInstance()로 Fragment 생성해야하는 이유

2020. 8. 12. 21:14android

-잦은 재생성

플래그먼트는 기본적으로 액티비티에 붙어서 만들어지고 액티비티가 없어질 때, 같이 파기됩니다. 하지만 그밖에 플래그먼트는 여러 이유로 지 혼자서 액티비티에서 파기되고 재생성 되기도 합니다. 뭐... 예를들면

LMK(Low Memory Killer)나 OOM(Out Of Memory), 화면이 회전될 때, 디스플레이 설정 변경 등등 정말 다양합니다.

 

이러한 이유들로 플래그먼트는 잦은 재생성이 일어나고 이를 해결하는 방법으로 newInstance() 메서드를 활용하는 것이죠. 먼저, 기본적으로 플래그먼트를 재생성하게 되면 default constructor를 호출하여 플래그먼트를 생성하게 됩니다. 다른 말로는 다른 인자값을 받지 않는 다는 것이죠. 아래 글은 구글 developer 문서에서 가져온 설명입니다. 

 

이 처럼 기본 생성자를 통해 기본적으로 생성하기 때문에 어떤 인자값을 전달해야 한다면 플래그먼트에서 처리할 수 있는 방법이 필요합니다. 그래서 나온 방법이 newInstance() 메서드를 이용하는 겁니다. newInstance()메서드는 별도의 overriding 하는 것이 아니라 플래그먼트를 생성하는 패턴 구조를 직접 만드는 것입니다.  

 

위의 사진처럼, newInstance() 메서드 내부에서 플래그먼트를 default 생성자를 통해서 생성합니다. 이때 가장 중요한 점은 default 생성자로 받을 수 없는 number 인자를 받을 수 있는 것입니다. 또한 bundle을 생성하여 만들어지는 플래그먼트에 set 해줍니다. 이렇게 하면 다음 번 플래그먼트가 재 생성될 때, newInstance() 메서드에서 set해주는 bundle을 다시 받을 수 있습니다. 

 

Fragment#instantiate(Context context, String fname, Bundle args)

 

이유는 위의 fragment setter를 보면 알 수 있습니다. 위의 메서드를 통해 재생성 될 때, 번들을 받게 됨으로써newInstance()메서드에서 set해준 bundle을 그대로 넘겨 받아 재 사용합니다. 그래서 화면 회전처럼 액티비티가 재 생성되면서 플래그먼트 또한 재 생성될 때,  bundle을 또 생성할 필요없이 기존의 것을 그대로 사용할 수 있는 것입니다. 

 

그럼 다음 편에서 이를 이용하여 viewPager2와 같이 써보겠습니다. 

'android' 카테고리의 다른 글

TabLayout과 viewPager2 연결하기  (0) 2020.08.12
ViewPager2 어댑터 사용 방법  (0) 2020.08.12
RecyclerView 2탄! item 클릭 시, 화면전환하기  (0) 2020.04.22
RecyclerView 사용해보기!( 1부 )  (1) 2020.04.17
Fragment LifeCycle  (4) 2020.03.03