Fragment를 만들 때 보편적으로 많이 사용하는 방식은

val fragment = FirstFragment()

위 처럼 사용할 것이다. Fragment를 생성하는 쪽에서 데이터를 넘겨줘야 하는 경우가 종종 있는데 이럴때 보편적으로

val age = 1
val fragment = FirstFragment(age)

위 처럼 사용했다. 이렇게 생성자로 바로 넘겨주는 방법을 사용했다 앱이 강제종료 되는 현상을 한번쯤은 겪어보지 않았을까 싶다. Fragment의 공식문서를 확인하면 주의사항이 적혀있다.

Fragment를 상속받을 땐 인자가 없는 기본 생성자를 반드시 포함해야 한다는 내용이다. Fragment는 자기만의 라이프사이클을 가지고 있지만 액티비티 라이프사이클에 종속적이다. 따라서 메모리가 부족하거나 화면회전, 디스플레이 변경 등의 다양한 이벤트로 액티비티가 재생성 될 때 프래그먼트도 재생성이 된다.

즉, 액티비티나 프래그먼트가 없어졌다 재생성될 때 시스템은 이 데이터를 복구할 수가 없기 때문이다. (값이 전달 되지 않기 때문에 크래시)

그렇기 때문에 newInstance를 사용해 bundle을 통해 데이터를 안전하게 전달하고 복구하도록 하는 것이 좋다.

더 자세한 정보는 여기

위에 같은 이유로 프래그먼트의 잦은 재생성이 일어난다. 이를 해결하는 방법으로 newInstance()를 활용하는 것이다.

companion object {
	  fun newInstance(): ThirdFragment {
        val fragment = ThirdFragment()
       val args = Bundle()
        args.putInt("test", 1)
        fragment.arguments = args

        return fragment
    }
}

Fragment 내부에 newInstance() 이름의 static 메서드를 만들고, 빈 생성자로 Fragment 인스턴스를 생성한다.

key-value 형식으로 bundle에 데이터를 저장한다.

arguments로 Fragment에 전달할 데이터를 설정한다.

Fragment에선 arguments로 전달된 데이터를 꺼내서 사용할 수 있다.

val age = 1
val fragment = FirstFragment.newInstance(age)