관리 메뉴

나만을 위한 블로그

[Android] 액티비티 vs 프래그먼트 차이 본문

Android

[Android] 액티비티 vs 프래그먼트 차이

참깨빵위에참깨빵 2021. 10. 7. 18:47
728x90
반응형

둘의 구현은 자주 해봤지만 차이점이라던가 언제 쓰는 게 좋은지 같은 이론적인 부분은 취약하다고 생각해 공부한 다음 정리해보려고 한다.

먼저 액티비티에 대해서 안드로이드 디벨로퍼에서 말하는 내용은 아래와 같다.

https://developer.android.com/guide/components/activities/intro-activities?hl=ko 

 

활동 소개  |  Android 개발자  |  Android Developers

활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페

developer.android.com

액티비티는 앱과 사용자의 상호작용을 위한 진입점 역할을 한다...(중략)...액티비티는 앱이 UI를 그리는 창을 제공한다. 이 창은 일반적으로 화면을 채우지만 화면보다 작고 다른 창 위에 떠 있을 수 있다. 일반적으로 한 액티비티는 앱에서 하나의 화면을 구현한다. 대부분의 앱에는 여러 화면이 포함돼 있다. 즉, 대부분의 앱은 여러 액티비티로 구성된다. 일반적으로 앱에서 하나의 액티비티가 기본 액티비티로 지정되며, 이 기본 액티비티는 사용자가 앱을 실행할 때 표시되는 첫 번째 화면이다. 각 액티비티는 다른 액티비티를 시작할 수 있다. 예를 들어 이메일 앱의 기본 화면이 받은편지함을 표시하는 화면을 제공할 경우, 기본 액티비티는 이메일 작성, 개별 이메일 열기 같은 작업을 위한 화면을 제공하는 다른 액티비티들을 실행할 수 있다.

 

디벨로퍼에서 말하는 액티비티의 내용을 정리하면 아래와 같다.

 

  • 액티비티는 앱의 진입점 역할을 하며, 앱은 여러 액티비티로 구성될 수 있다
  • 액티비티는 다른 액티비티를 시작할 수 있다

 

액티비티가 앱의 시작점이라면, 액티비티의 생명주기 상 가장 먼저 실행되는 onCreate()가 진짜 시작점이라고 볼 수도 있겠다. C언어나 자바는 메인 메서드가 시작점이지만 안드로이드 시스템에선 앱이 다른 앱을 호출할 때 그 앱의 특정 액티비티를 호출해 해당 앱을 시작하는 것이기 때문에, 결국 액티비티는 사용자와 앱 사이의 상호작용을 위한 진입점 역할을 함과 동시에 하나의 UI를 그리는 컨테이너 역할을 수행한다. 아래는 액티비티의 생명주기를 그림으로 표시한 것이다.

 

 

다음으로 프래그먼트에 대해선데, 그 전에 프래그먼트가 어째서 만들어지게 된 건지에 대해 찾아봤다.

https://charlezz.medium.com/activity-vs-fragment-%EB%AC%B4%EC%97%87%EC%9D%84-%EC%84%A0%ED%83%9D%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C-56ce7fa2bfc4

 

Activity vs Fragment, 무엇을 선택해야 할까?

프레그먼트(Fragment)를 처음 도입한것은 2011년 2월 에 등장한 Android 3.0(Honey comb, API11) 부터다. 안드로이드 등장 초기부터 함께 했기 때문에 프레그먼트를 모르는 안드로이드 개발자는 없을 것으로

charlezz.medium.com

- 유연한 UI/UX 구현 : 프래그먼트는 태블릿 같은 큰 화면에서 역동적이고 유연한 UI 디자인을 지원하는 게 목적이었다. 태블릿 화면은 핸드폰 화면보다 훨씬 크기 때문에 UI 구성요소 조합과 표현할 공간이 더 많다

- 재사용성 증가 : 뷰 또는 비즈니스 로직을 프래그먼트 단위로 분리할 수 있다. 아키텍처 원칙에서 가장 중요한 원칙인 관심사 분리를 통해 의존성을 분리하고 독립성을 키우게 되는 것이다. 이걸 잘 이용하면 프래그먼트로 구현한 내용을 다른 액티비티 또는 프래그먼트에서 재사용할 수 있다. DialogFragment를 확장한 클래스는 FragmentManager만 제공하면 어느 곳에서나 다이얼로그를 노출할 수 있게 된다. 하지만 프래그먼트가 특정 액티비티 또는 프래그먼트에 의존적이라면 재사용하기 힘들다

- 퍼포먼스 관점 : 액티비티는 무겁다. 초기화에 몇 초가 걸리는 건 아니지만 프래그먼트에 비해 상대적으로 무겁다. 그렇다고 액티비티가 필요없는 건 아니다. 프래그먼트는 단독으로 존재할 수 없고 반드시 액티비티 안에서 호스팅되어야 한다. 액티비티에서 프래그먼트는 상대적으로 가볍게 추가, 삭제가 가능하다. 그래서 액티비티 스택에 액티비티를 쌓아두는 것보다 프래그먼트 백스택에서 프래그먼트를 관리하는 게 메모리 관리 면에서도 효율적이며, 화면 전환도 액티비티보다 더 순조롭게 할 수 있다

- 데이터 공유 : 액티비티 간 데이터를 공유하는 일반적인 방법은 싱글톤, 앱 내 객체 공유 등을 제외하면 인텐트 밖에 없다. 액티비티는 다른 프로세스에서 실행하는 걸 염두하고 설계됐기 때문에 메모리 영역을 공유하지 않는다. 때문에 리눅스 커널 레벨에서 프로세스 간 통신(IPC)을 하게 되는데 이 부분에서 많은 제약사항이 생기며 메모리를 직접 공유하는 것보다 퍼포먼스가 떨어지게 된다. 프래그먼트를 쓰면 프래그먼트 간 데이터 공유는 액티비티 안에서 자유롭게 이뤄진다. 코드베이스에서 데이터 전달 과정이 복잡해 보일 수 있지만 뷰모델 또는 DI 프레임워크로 이 부분을 좀 더 매끄럽게 만들 수 있다

 

결론적으로 프래그먼트는 태블릿을 위해서, 코드 재사용을 위해서 설계된 것이다. 또한 액티비티 없이 독립적으로 존재할 수 없고 액티비티에 비해 상대적으로 가볍다는 특징도 있다.

프래그먼트의 특징을 정리하면 아래와 같다.

 

  • 프래그먼트는 단일 화면이나 화면 일부의 UI를 정의, 관리하는 데 적합하다
  • UI를 프래그먼트로 나누면 런타임 시 액티비티의 모양을 더 쉽게 수정할 수 있다. 액티비티가 STARTED 상태 이상에 있는 동안 프래그먼트를 추가, 교체, 삭제할 수 있다. 이런 변경사항들의 기록을 액티비티에서 관리하는 백 스택에 보관할 수 있어 변경사항을 취소할 수 있다
  • 프래그먼트는 뷰의 하위 클래스가 아니기 때문에 findViewById()를 즉시 호출할 수 없다. 대신 내부에 뷰가 있어서 특정 메서드 안에서 view.findViewById()를 통해 XML 안의 뷰 참조 객체를 만들 수 있다
  • 프래그먼트는 액티비티와 같이 레이아웃, 생명주기를 갖고 있는 독립적인 모듈이다. 그러나 액티비티 없이 프래그먼트는 존재할 수 없다

 

프래그먼트 기반 아키텍처에선 액티비티는 탐색용, 프래그먼트는 보기 및 논리용이라고 한다.

https://guides.codepath.com/android/creating-and-using-fragments

 

Creating and Using Fragments | CodePath Android Cliffnotes

Overview A fragment is a reusable class implementing a portion of an activity. A Fragment typically defines a part of a user interface. Fragments must be embedded in activities; they cannot run independently of activities. Understanding Fragments Here are

guides.codepath.com

 

 

반응형

'Android' 카테고리의 다른 글

[Android] 안드로이드 OS의 구조  (0) 2021.10.08
[Android] 인텐트란?  (0) 2021.10.07
[Android] 뷰모델이란? + 뷰모델 코틀린 예제  (0) 2021.10.04
[Android] 서비스란?  (0) 2021.10.01
[Android] 인텐트 필터란?  (0) 2021.09.30
Comments