Fragment에 데이터를 전달할 때 newInstance를 사용하는 이유를 설명합니다.
Fragment를 배우기 시작했을 무렵 newInstance가 등장했을 때에 「이것은 생성자로 구현하는 것은 안 되는 거야?」 「인스턴스 후 setter 메서드로 데이터를 건네주면 되는 것은?」
이번에는 그런 의문에 대해 정리했습니다.
인수 있는 생성자로 구현하면 되지 않나?
첫째, 결론에서 말하면 생성자에서 구현하면 앱이 충돌 할 수 있습니다.
그렇다면 왜 앱이 충돌합니까?
실은 Fragment의 부모인 Activity는 단말의 메모리 부족이나화면 회전 시에 Activity가 파기되어 버립니다. 부모가 파기되면 필연적으로 자식인 Fragment도 파기되어 버립니다.
파기 후 재생성된 Activity는 FragmentManager를 사용하여 Fragment를 재생성합니다.
위의 재생성 타이밍에서 FragmentManager는 인수 없는 생성자에서 재생성을 수행합니다.
위의 시점에서 충돌합니다.
왜 위의 타이밍에 충돌하는지 말하면
Java에는 룰이 있어 인수 있는 생성자만 정의했을 경우에 인수 없음 constructor으로 인스턴스 생성했을 경우에
충돌합니다.
그 때문에 충돌 하는 것입니다.
물론 인수 없는 생성자를 정의한 경우에는 충돌하지 않지만 충돌을 방지하기 위해 인수 없는 생성자를 정의하면
제3자는 " 무엇을 위해 정의하고 있는가? " 에 대해서 의문이 들기 때문에 추천하지 않습니다.
인스턴스 후 setter 메서드로 데이터를 전달하면 좋을까요?
그렇다면 인스턴스 생성 후에 setter 메소드로 데이터를 전달하면 좋을까요?
결론, 충돌하지 않습니다.
하지만 setter 클래스에서 전달한 데이터가 재생성시 초기화됩니다.
재생성 시 FragmentManager에서 인수 없는 생성자만 호출되기 때문에 setter 메서드는 호출되지 않습니다.
그렇다면 왜 newIntance라고 데이터를 유지할 수 있습니까?
newInstance의 구현
public static HogeFragment newInstance(int data) {
Bundle args = new Bundle();
args.putInt("DATA", data);
MainFragment fragment = new HogeFragment();
fragment.setArguments(args);
return fragment;
}
setArguments로 건네준 Bundle 클래스가 Fragment 재생성시에 데이터가 복원되기 때문에 데이터를 보관 유지할 수 있는 구조로 되어 있습니다.
또 setter 클래스에서는 아래와 같은 2가지의 문제도 발생합니다.
- 인스턴스 생성, setter 클래스가 총 두줄이 된다
- setter 클래스를 액세스 한정자를 public 등으로 설정하지 않으면 안 됩니다.
newInstance를 사용하면 인스턴스 생성 + 데이터를 전달하므로 newInstance의 한 줄로 끝납니다.
그리고,
인스턴스 생성 후에 데이터를 다시 전달할 수 있는 설계가 되어 버립니다.
제3자로부터 하면「외부로부터 데이터를 다시 건네줄 수 있을까」라고 생각이 됩니다.
newInstance는 인스턴스 생성+데이터를 전달.데이터 전달만은 할 수 없기 때문에
제3자는 「인스턴스 생성하고 데이터를 건네주고 있다」라고 하는 인식이 됩니다.
따라서 newInstance를 사용해야 합니다!
'개발 > 안드로이드 어플' 카테고리의 다른 글
안드로이드 어플 setFlags()를 사용해서 복수의 화면 이동 (2) | 2022.12.07 |
---|---|
안드로이드 어플 Fragment란 ? + 수명주기 (2) | 2022.12.05 |
안드로이드 어플 Strings 관리 텍스트 strings.xml (0) | 2022.12.04 |
⑦안드로이드어플개발 - AlertDialog 다이아로그 / 팝업창 출력 / 대화 / 모달창 (0) | 2022.11.29 |
⑥안드로이드어플개발 - Logcat 디버깅하는 방법 log출력|debug (0) | 2022.11.29 |
댓글