본문 바로가기
개발/안드로이드 어플

안드로이드 어플 Fragment 데이터 전달 인스턴스를 만드는 이유?

by 외노자개발 2022. 12. 4.
반응형

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를 사용해야 합니다!

반응형

댓글