개요
Activity와 Fragment는 Android에서 화면을 구성하는 두 개의 클래스이다.
안드로이드 개발을 하면서 어떤 화면에선 Activity를 사용하고, 어떤 화면에선 Fragment를 사용하곤 하는데
각각의 특징을 통해서 화면을 구성하는데 Activity와 Fragment를 사용하는 기준을 공부하고자 한다.
그리고 공부한 것 내용을 토대로 개인적인 생각을 적은 글이라 너무 맹신하진 않았으면 좋겠습니다..ㅎ
Activity
우선 Activity에 대해서 많은 사람들이 알고 있다고 생각합니다.
Android의 4대 컴포넌트 중의 하나이며, 앱이 사용자와 상호작용을 하는 UI를 그리는 창을 제공해 줍니다.
흔히들 Android Studio에서 처음으로 프로젝트를 생성할 때 만들어지는 것이 MainActivity이며 홈화면을 가리키는 것이죠.
Fragment
간단하게 말하면 Fragment는 Activity 안에서 화면의 일부를 구성하는 부분이라고 할 수 있다.
물론 Fragment안의 Fragment가 들어가는 구조도 있지만 흔히 하나의 Activity 아래의 여러 개의 프래그먼트가 들어가 있다.
위 화면과 같이 Activity A안의 여러개의 Fragment가 존재하고, 각 Fragment는 다른 UI를 구성하고 있다.
그림과 같이 Fragment의 등장 배경은 태블릿과 같이 큰 화면에 대응하기 위해서 등장했다.
태블릿은 휴대폰보다 화면이 크기 때문에 UI 구성요소를 조합해서 사용자의 경험을 향상할 수 있는 공간이 휴대폰보다 많이 있습니다.
공식문서에서 강조하는 것은 재사용성이다.
개발을 함에 있어서 재사용이라는 단어는 긍정적인 단어라고 생각한다.
이러한 재사용이라는 개념을 극한으로 끌어올린 것이 객체지향언어와 함수이고, 재사용가능하다면 그만큼 개발의 비용이 줄기 때문에
반복적인 코드의 사용, 여러 개의 Activity보다는 재사용할 수 있는 요소를 사용해서 최소한의 코드를 작성하는 것이 효과적이다.
그렇다면 Activity만으로만 화면을 구성하는 것보다 Fragment를 사용하는 것에 있어서 어떠한 이점을 얻을 수 있을까?
재사용성
Fragment의 공식문서에서 강조하는 것은 Framgent를 통해서 화면을 재사용할 수 있게 만들라는 뜻으로 해석했다.
즉 하나의 Activity를 기준으로 여러 개의 Fragment를 만들어서 여러개의 Activity로 화면을 구성하는것이 아닌
여러 개의 Fragment로 갈아끼워서 재사용성을 높일 수 있다.
그 외에도 DialogFramgnet를 통해서 하나의 DialogFragment를 여러 화면에서 호출할 수 있고,
이는 재사용성의 측면에서 굉장히 용이하다.
하지만 일반적인 Fragment는 개발과정에서 여러개의 화면에서 사용할 수 있게 만들기란 쉽지 않다.
특정 Activity나 Fragment에서만 사용하게 설계하는 것이 내가 설계한 Fragment의 대부분이었다.
즉 어느 Activity나 Framgnet에 의존하게 만들면 안 된다.
이는 쉽지는 않지만, 재사용할 수 있는 Fragment라면 최대한 범용적으로 만드는 것이 옳은 방향성인 것 같다.
다양한 UI와 UX 구현
위에서 언급했듯이 Fragment는 태블릿과 같이 큰 화면에 대응하기 위해 등장했다.
보다 사용자 입장에서 역동적이고 유연한 디자인을 제공할 수 있다.
예를 들어 Navigation Drawer나, Bottom Navigation을 통해서 클릭만으로 다른 화면을 이동하는 등
사용자 측면에서 역동적이고 유연한, 그리고 다양한 UI와 UX를 제공할 수 있다.
성능 관점
휴대폰이라는 기계 특성상 메모리나 성능에 중점을 둘 수밖에 없다.
아무리 기능이 좋고, 사용성이 좋더라도 앱이 무겁고, 느리다면 사용하기 꺼려질 것이다.
이러한 측면에서 여러 개의 Activiy로 화면을 구성하는 것보단 Activity와 N개의 Fragment를 이용하는 구조가
유리한 것은 사실이다.
그리고 화면을 전환할 때의 BackStack 관리도 Activity보단 상대적으로 Fragment가 삭제, 추가가 용이하다.
이는 Navigation Component와 Fragment Manager를 사용하면 Activity보다 쉽게 관리할 수 있다.
데이터 교환
MindSync라는 프로젝트를 하면서 정말 많이 느꼈던 점이다.
Activity와 Activity 간의 화면 전환에서 전달해야 할 데이터를 구현하는 과정은 Intent를 사용해야 한다.
이 Intent 코드는 개인적으로 사용하기 불편했다.
하지만 Fragment의 코드는 비교적 간단하고, 데이터 공유가 Activity보다 자유롭다.
Navigation을 통한 Safe Args를 이용해 argument를 명시해 전달하고, 전달받을 수 있는데 구현이 그렇게 어렵지 않았고,
참고할만한 자료도 많았다.
이렇게 많은 장점을 듣고 보면 하나의 Activity와 여러 개의 프래그먼트로 앱을 구성하면 되지 않을까라는 생각이 자연스럽게 들곤 한다.
하지만 고려해야 할 점이 적지 않게 있다.
이는 Fragment의 특징과 관련이 있다.
Fragment의 특징
Fragment는 독자적으로 존재할 수 없다.
공식문서에서의 내용을 보면 Fragment는 항상 Activity 내에서 호스팅 되어야 하며,
호스트 Activity의 수명주기에 직접적으로 영향을 받는다.
즉 Fragment는 Activity에 종속되어 있다.
Fragment는 Activity와 다른 고유의 생명주기가 있다.
Activity의 생명주기만 해도 머리가 아프고, 고려해야 할 점이 많은데, Fragment도 고유의 생명주기가 존재하다.
왼쪽이 Activity, 오른쪽이 Fragment이다.
위에서 언급한 것처럼 Framgnet의 생명주기는 호스트 Activity의 생명주기에 영향을 받는다.
따라서 Fragment를 사용할 경우 Activity의 생명주기와 Fragment 생명주기 모두 고려를 해야 하고, 이는 상당히 복잡하다.
결론?
공부를 해보고 느낀 점은 Activity와 Fragment를 나누는 기준은 시나리오에 따라 다르다는 것을 느꼈다.
즉 완벽한 정답은 없다고 생각한다.
하지만 Fragment를 잘 이용한다면 사용자 측면에서 다양한 UI와 UX를 제공할 수 있고, 완성도 높은 앱을 만들 수 있다.
이를 위해서 Activity와 Fragment의 생명주기를 잘 이해하고 사용해야 한다고 생각한다.
이게 정말 어렵지만,, 반드시 해야 하는 부분이다.. 😭
참고
https://developer.android.com/guide/components/activities/intro-activities?hl=ko
https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko
https://developer.android.com/guide/components/fragments?hl=ko
'Skils > Android' 카테고리의 다른 글
[Android] - UI Layer, UI State, UI Event (0) | 2024.01.29 |
---|---|
[Android] - 코루틴(Coroutine) (0) | 2024.01.20 |
[Android] - ListAdapter (0) | 2023.12.11 |
[Android] - RecyclerView 체크박스 유지하기 (0) | 2023.12.10 |
[Android] - CustomView DrawText (0) | 2023.12.10 |