일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ar vr 차이
- ANR이란
- 서비스 쓰레드 차이
- rxjava hot observable
- 큐 자바 코드
- jvm이란
- Rxjava Observable
- 안드로이드 라이선스
- 자바 다형성
- rxjava cold observable
- 안드로이드 레트로핏 crud
- android retrofit login
- 스택 자바 코드
- 안드로이드 유닛테스트란
- 안드로이드 유닛 테스트 예시
- 2022 플러터 안드로이드 스튜디오
- rxjava disposable
- 안드로이드 os 구조
- 2022 플러터 설치
- android ar 개발
- 객체
- 안드로이드 라이선스 종류
- 플러터 설치 2022
- 클래스
- 멤버변수
- 안드로이드 레트로핏 사용법
- 안드로이드 유닛 테스트
- 스택 큐 차이
- 서비스 vs 쓰레드
- jvm 작동 원리
- Today
- Total
나만을 위한 블로그
[Android] 액티비티 vs 프래그먼트 차이 본문
둘의 구현은 자주 해봤지만 차이점이라던가 언제 쓰는 게 좋은지 같은 이론적인 부분은 취약하다고 생각해 공부한 다음 정리해보려고 한다.
먼저 액티비티에 대해서 안드로이드 디벨로퍼에서 말하는 내용은 아래와 같다.
https://developer.android.com/guide/components/activities/intro-activities?hl=ko
액티비티는 앱과 사용자의 상호작용을 위한 진입점 역할을 한다...(중략)...액티비티는 앱이 UI를 그리는 창을 제공한다. 이 창은 일반적으로 화면을 채우지만 화면보다 작고 다른 창 위에 떠 있을 수 있다. 일반적으로 한 액티비티는 앱에서 하나의 화면을 구현한다. 대부분의 앱에는 여러 화면이 포함돼 있다. 즉, 대부분의 앱은 여러 액티비티로 구성된다. 일반적으로 앱에서 하나의 액티비티가 기본 액티비티로 지정되며, 이 기본 액티비티는 사용자가 앱을 실행할 때 표시되는 첫 번째 화면이다. 각 액티비티는 다른 액티비티를 시작할 수 있다. 예를 들어 이메일 앱의 기본 화면이 받은편지함을 표시하는 화면을 제공할 경우, 기본 액티비티는 이메일 작성, 개별 이메일 열기 같은 작업을 위한 화면을 제공하는 다른 액티비티들을 실행할 수 있다.
디벨로퍼에서 말하는 액티비티의 내용을 정리하면 아래와 같다.
- 액티비티는 앱의 진입점 역할을 하며, 앱은 여러 액티비티로 구성될 수 있다
- 액티비티는 다른 액티비티를 시작할 수 있다
액티비티가 앱의 시작점이라면, 액티비티의 생명주기 상 가장 먼저 실행되는 onCreate()가 진짜 시작점이라고 볼 수도 있겠다. C언어나 자바는 메인 메서드가 시작점이지만 안드로이드 시스템에선 앱이 다른 앱을 호출할 때 그 앱의 특정 액티비티를 호출해 해당 앱을 시작하는 것이기 때문에, 결국 액티비티는 사용자와 앱 사이의 상호작용을 위한 진입점 역할을 함과 동시에 하나의 UI를 그리는 컨테이너 역할을 수행한다. 아래는 액티비티의 생명주기를 그림으로 표시한 것이다.
다음으로 프래그먼트에 대해선데, 그 전에 프래그먼트가 어째서 만들어지게 된 건지에 대해 찾아봤다.
- 유연한 UI/UX 구현 : 프래그먼트는 태블릿 같은 큰 화면에서 역동적이고 유연한 UI 디자인을 지원하는 게 목적이었다. 태블릿 화면은 핸드폰 화면보다 훨씬 크기 때문에 UI 구성요소 조합과 표현할 공간이 더 많다
- 재사용성 증가 : 뷰 또는 비즈니스 로직을 프래그먼트 단위로 분리할 수 있다. 아키텍처 원칙에서 가장 중요한 원칙인 관심사 분리를 통해 의존성을 분리하고 독립성을 키우게 되는 것이다. 이걸 잘 이용하면 프래그먼트로 구현한 내용을 다른 액티비티 또는 프래그먼트에서 재사용할 수 있다. DialogFragment를 확장한 클래스는 FragmentManager만 제공하면 어느 곳에서나 다이얼로그를 노출할 수 있게 된다. 하지만 프래그먼트가 특정 액티비티 또는 프래그먼트에 의존적이라면 재사용하기 힘들다
- 퍼포먼스 관점 : 액티비티는 무겁다. 초기화에 몇 초가 걸리는 건 아니지만 프래그먼트에 비해 상대적으로 무겁다. 그렇다고 액티비티가 필요없는 건 아니다. 프래그먼트는 단독으로 존재할 수 없고 반드시 액티비티 안에서 호스팅되어야 한다. 액티비티에서 프래그먼트는 상대적으로 가볍게 추가, 삭제가 가능하다. 그래서 액티비티 스택에 액티비티를 쌓아두는 것보다 프래그먼트 백스택에서 프래그먼트를 관리하는 게 메모리 관리 면에서도 효율적이며, 화면 전환도 액티비티보다 더 순조롭게 할 수 있다
- 데이터 공유 : 액티비티 간 데이터를 공유하는 일반적인 방법은 싱글톤, 앱 내 객체 공유 등을 제외하면 인텐트 밖에 없다. 액티비티는 다른 프로세스에서 실행하는 걸 염두하고 설계됐기 때문에 메모리 영역을 공유하지 않는다. 때문에 리눅스 커널 레벨에서 프로세스 간 통신(IPC)을 하게 되는데 이 부분에서 많은 제약사항이 생기며 메모리를 직접 공유하는 것보다 퍼포먼스가 떨어지게 된다. 프래그먼트를 쓰면 프래그먼트 간 데이터 공유는 액티비티 안에서 자유롭게 이뤄진다. 코드베이스에서 데이터 전달 과정이 복잡해 보일 수 있지만 뷰모델 또는 DI 프레임워크로 이 부분을 좀 더 매끄럽게 만들 수 있다
결론적으로 프래그먼트는 태블릿을 위해서, 코드 재사용을 위해서 설계된 것이다. 또한 액티비티 없이 독립적으로 존재할 수 없고 액티비티에 비해 상대적으로 가볍다는 특징도 있다.
프래그먼트의 특징을 정리하면 아래와 같다.
- 프래그먼트는 단일 화면이나 화면 일부의 UI를 정의, 관리하는 데 적합하다
- UI를 프래그먼트로 나누면 런타임 시 액티비티의 모양을 더 쉽게 수정할 수 있다. 액티비티가 STARTED 상태 이상에 있는 동안 프래그먼트를 추가, 교체, 삭제할 수 있다. 이런 변경사항들의 기록을 액티비티에서 관리하는 백 스택에 보관할 수 있어 변경사항을 취소할 수 있다
- 프래그먼트는 뷰의 하위 클래스가 아니기 때문에 findViewById()를 즉시 호출할 수 없다. 대신 내부에 뷰가 있어서 특정 메서드 안에서 view.findViewById()를 통해 XML 안의 뷰 참조 객체를 만들 수 있다
- 프래그먼트는 액티비티와 같이 레이아웃, 생명주기를 갖고 있는 독립적인 모듈이다. 그러나 액티비티 없이 프래그먼트는 존재할 수 없다
프래그먼트 기반 아키텍처에선 액티비티는 탐색용, 프래그먼트는 보기 및 논리용이라고 한다.
https://guides.codepath.com/android/creating-and-using-fragments
'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 |