[Android] About fragment

좋은 예제나 라이브러리에 심심치 않게 Fragment를 사용하는것을 보았습니다.
잘은 모르겠지만 Activity와 비슷한 것 같은데..
명확한 차이를 알 수 없어 알아보았습니다.

일단 Fragment가 나오기 전 상황을 좀 알아야 겠군요.

Activity, Context

안드로이드 시작과 함께 Activity가 무엇인지 Context가 무엇인지 알아야 했습니다.
기존에 C, C++, Java를 배울때와는 사뭇 다르고 저에게는 러닝 커브또한 굉장히 높았습니다.
점점 익숙해질 무렵 Activity는 어플리케이션 구성 요소로 단어 그대로 사용자가 어떠한 행위를 하기 위해 작용할 수 있는 화면이고
Context는 Activity에 따라 정보를 담고 있는 인터페이스라는것을 알게되었습니다.
이 두가지의 개념으로 화면단위를 컨트롤하고 문제없이 개발이 되는 줄 알았습니다.

어플리케이션의 덩치는 날로 커져갔습니다.
단순히 Multi Activity로 해결되던 어플리케이션이 그 이상의 수준을 넘어 Super Ultra Multi Activity로 엄청난 서비스를 제공하는 어플리케이션이 등장합니다.

그런데 여기서 문제점이 생깁니다.
많이 흡사한 페이지가 여러개인데.. 그때마다 Activity와 Layout이 하나씩 생성되고 중복 코드들이 기하급수적으로 늘어나게 됩니다.

이때 Google에서 Fragment를 조용히 내놓습니다.

Fragment

구글은 이렇게 설명하고 있습니다.

Fragment는 동작 또는 Activity 내에서 사용자 인터페이스의 일부를 나타냅니다. 여러 개의 프래그먼트를 하나의 액티비티에 조합하여 창이 여러 개인 UI를 구축할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있습니다. 프래그먼트는 자체 수명 주기를 가지고, 자체 입력 이벤트를 받으며, 액티비티 실행 중에 추가 및 제거가 가능한 액티비티의 모듈식 섹션이라고 생각하면 됩니다(다른 액티비티에 재사용할 수 있는 “하위 액티비티”와 같은 개념).

간단히 설명하면 한 액티비티 안에서 프래그먼트로 지정한 영역에 뷰를 바꿔칠수 있다는 얘깁니다.
위에서 설명한 파일 관리나 중복 코드들이 기하급수적으로 늘어나는 유지보수가 편해지는 소리가 들립니다.

프래그먼트를 생성하는 과정

프래그먼트를 생성하기 위해서는 최소한의 수명 주기 메서드를 구현해야 합니다.

onCreate()
시스템은 프래그먼트를 생성할 때 이것을 호출합니다. 구현 내에서 프래그먼트의 기본 구성 요소 중 프래그먼트가 일시정지되거나 중단되었다가 재개되었을 때 유지하고자 하는 것을 초기화해야 합니다.

onCreateView()
시스템은 프래그먼트가 자신의 사용자 인터페이스를 처음으로 그릴 시간이 되면 이것을 호출합니다. 프래그먼트에 맞는 UI를 그리려면 메서드에서 View를 반환해야 합니다. 이 메서드는 프래그먼트 레이아웃의 루트입니다. 프래그먼트가 UI를 제공하지 않는 경우 null을 반환하면 됩니다.

onPause()
시스템이 이 메서드를 호출하는 것은 사용자가 프래그먼트를 떠난다는 첫 번째 신호입니다(다만 이것이 항상 프래그먼트가 소멸 중이라는 뜻은 아닙니다). 현재 사용자 세션을 넘어서 지속되어야 하는 변경 사항을 커밋하려면 보통 이곳에서 해야 합니다(사용자가 돌아오지 않을 수 있기 때문입니다).

일단 Activity와 비슷합니다.
그렇다면 생명주기가 어떤지 확인할 필요가 있겠네요

생명주기가 이게뭐지?

Activity 생명주기와 함께 그안에서 동작하는 하나가 아닌 다수의 Fragment를 관리해야 하는데…
그 Fragment의 생명주기가 이렇답니다.

Activity 상태에 따라서는..

Fragment는 Activity 상태에 따라 세분화 해서 관리해야 한다는 의미로 보여집니다.

혹시 설명이 필요할 지 모르니 간단히 구글의 설명을 인용합니다.

프래그먼트의 수명 주기를 관리하는 것은 액티비티의 수명 주기를 관리하는 것과 매우 비슷합니다. 액티비티와 마찬가지로 프래그먼트는 세 가지 상태로 존재할 수 있습니다.

재개됨(Resumed)
프래그먼트가 실행 중인 액티비티에 표시됩니다.

일시정지됨(Paused)
또 다른 액티비티가 포그라운드에 있고 포커스를 갖고 있지만, 이 프래그먼트가 있는 액티비티도 여전히 표시됩니다(포그라운드의 액티비티가 부분적으로 투명하거나 전체 화면을 뒤덮지 않습니다).

정지됨(Stopped)
프래그먼트가 표시되지 않습니다. 호스트 액티비티가 정지되었거나 프래그먼트가 액티비티에서 제거되었지만 백 스택에 추가되었습니다. 정지된 프래그먼트도 여전히 표시는 됩니다(모든 상태 및 멤버 정보를 시스템이 보존합니다). 하지만, 사용자에게는 더 이상 표시되지 않으며 액티비티를 종료하면 이것도 종료됩니다.

결론

나쁘지 않습니다.
Fragment를 사용하기 위해 알아야 될 것이 한두가지가 아니라는 생각이 듭니다.
많이 알아야 한다는 것은 복잡하며 신경써야 할 일이 많다는 것과 일맥상통합니다.
저렇게 복잡한 생명주기의 Fragment를 하나가 아니고 여러개를 사용하려면 굉장한 학습과 내공이 필요한 것 같습니다.
내용에서 알 수 있듯, 이 Fragment는 간단히 이론으로만 넘길 수 없겠네요.
조만간 간단한 예제를 들고 소스코드와 함께 설명하겠습니다.