Fragment는 Activity에 포함되고 FragmentManager를 통해 관리되는 Android의 재사용 가능한 UI 구성 요소입니다. 각 프래그먼트는 고유한 생명주기, 레이아웃 및 상태를 가집니다. Fragment는 다양한 화면 크기에 대한 적응과 코드 재사용을 단순화합니다. 자세한 내용은 Google 공식 가이드를 참조하세요.
주요 포인트
Fragment는 Activity 내에서 화면의 일부를 나타내는 모듈식 Android 사용자 인터페이스 구성 요소입니다. Fragment는 자체 레이아웃을 관리하고, 생명주기 이벤트를 처리하며, 상태를 저장할 수 있습니다. 모듈성 덕분에 하나의 프래그먼트를 다른 Activity와 다른 기기에서 사용할 수 있습니다.
Fragment API는 태블릿을 지원하기 위해 2011년 Android 3.0(Honeycomb, API 11)에서 등장했습니다. 그 이전에는 개발자가 휴대폰과 태블릿용으로 별도의 Activity를 만들어야 했습니다. Fragment는 독립적인 블록으로 화면을 조립할 수 있게 했습니다. 2019년 Google은 API 4까지의 하위 호환성을 가진 Jetpack Fragment 라이브러리를 출시했습니다.
Google(2026)에 따르면, Google Play 앱의 80%가 어떤 형태로든 Fragment를 사용합니다. Jetpack Fragment 라이브러리는 Google Play Services를 통해 100억 회 이상 다운로드되었습니다. Fragment는 Jetpack Compose 시대에도 Android 아키텍처의 핵심 구성 요소로 남아 있습니다.
Fragment의 생명주기는 호스트 Activity의 상태에 의존하기 때문에 Activity보다 더 복잡합니다. Fragment는 Activity와 동일한 상태를 거치지만 자체 콜백(onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach)을 추가합니다.
| Fragment 콜백 | Activity 해당 | 목적 |
|---|---|---|
| onAttach | onCreate 전 | Fragment가 Activity에 연결됨 |
| onCreate | onCreate | UI 외 데이터 초기화 |
| onCreateView | onCreate | inflater를 통한 레이아웃 생성 |
| onViewCreated | onCreate | 뷰 생성 후 UI 요소 바인딩 |
| onDestroyView | onDestroy | 뷰 제거, UI 리소스 해제 |
| onDetach | onDestroy | Fragment가 Activity에서 분리됨 |
Fragment 생명주기의 주요 차이점은 onCreate와 onDestroy 사이에 onCreateView와 onDestroyView가 호출된다는 것입니다. Fragment는 UI 없이도 존재할 수 있습니다(onCreateView가 null을 반환하는 경우). Activity 재생성 후 FragmentManager가 자동으로 프래그먼트를 복원합니다.
FragmentManager는 Activity에서 프래그먼트를 관리하는 중앙 클래스입니다. 프래그먼트 추가, 제거, 교체, 백 스택 관리 및 상태 복원을 담당합니다. FragmentManager는 supportFragmentManager(AndroidX) 또는 fragmentManager(이전 API)를 통해 사용할 수 있습니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 프래그먼트가 아직 추가되지 않음 — 생성 중
if (savedInstanceState == null) {
val transaction = this.supportFragmentManager
.beginTransaction()
transaction.add(R.id.fragment_container, ListFragment())
transaction.addToBackStack(null)
transaction.commit()
}
}
fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit()
}
}FragmentTransaction 트랜잭션은 원자적입니다. commit()은 다음 Looper 사이클에서 실행을 예약합니다. 즉시 실행하려면 commitNow()를 사용하세요. addToBackStack(null)은 트랜잭션을 백 스택에 추가합니다 — 뒤로 가기 버튼이 작업을 취소합니다.
Kotlin 예제를 통해 Fragment 생명주기의 주요 메서드를 살펴보겠습니다. onCreateView는 레이아웃을 생성합니다 — Activity와 달리 메서드는 View를 반환해야 합니다. onViewCreated는 그 직후에 호출되며, 여기서 ID로 요소를 찾는 것이 안전합니다. onDestroyView는 뷰 참조를 정리하는 마지막 순간입니다.
class DetailFragment : Fragment() {
private var _binding: FragmentDetailBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDetailBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textTitle.setText("세부 정보")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}View Binding 패턴(_binding/binding)은 onDestroyView 후에 레이아웃 참조가 null이 되도록 보장합니다. 뷰가 소멸된 후 binding에 접근하면 NullPointerException이 발생합니다. Google은 모든 프래그먼트에 이 패턴을 권장합니다.
프래그먼트 간 데이터 전송을 위해 Android는 여러 메커니즘을 제공합니다. 가장 안정적인 것은 하나의 Activity의 프래그먼트 간에 공유되는 ViewModel입니다. Fragment Result API는 일회성 이벤트에 적합합니다. Bundle 인수는 프래그먼트 생성 시 데이터용입니다.
// 두 프래그먼트를 위한 공유 ViewModel
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// 프래그먼트 A: Fragment Result API를 통해 이벤트 전송
setFragmentResult("request_key", bundleOf("key" to "value"))
// 프래그먼트 B: 이벤트 수신
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API(Fragment 1.3.0에서 추가)는 더 이상 사용되지 않는 setTargetFragment/onActivityResult를 대체합니다. 이 API는 타입 안전하며, Bundle을 사용하고, 수신자에 대한 지식이 필요하지 않습니다. Parent FragmentManager가 프래그먼트 간 중개자 역할을 합니다.
Fragment와 Activity 중 선택은 애플리케이션 아키텍처에 따라 달라집니다. Fragment는 적응형 레이아웃(휴대폰 + 태블릿), 사용자 정의 전환 애니메이션 및 Jetpack Navigation 사용에 필수적입니다. Activity는 1~2개 화면의 간단한 앱에 적합합니다.
| 기준 | Fragment | Activity |
|---|---|---|
| 생성 속도 | 빠름(가벼운 구성 요소) | 느림(시스템 프로세스) |
| 재사용성 | 높음(하나의 Fragment를 다른 Activity에서) | 낮음(각 화면에 자체 Activity) |
| 전환 애니메이션 | 유연함(FragmentTransaction) | 제한적(overridePendingTransition) |
| 회전 시 보존 | 자동(관리자가 복원) | 수동(onSaveInstanceState) |
| Deep Links | Navigation Component를 통해 | intent-filter를 통한 네이티브 지원 |
Fragment 작업의 현대적인 접근 방식은 Jetpack Navigation Component로, 수동 FragmentManager 관리를 대체합니다. 이 라이브러리는 NavGraph(XML 탐색 그래프), NavHostFragment 및 타입 안전한 데이터 전송을 위한 Safe Args를 제공합니다.
Jetpack Fragment 라이브러리(androidx.fragment:fragment-ktx)에는 FragmentResult API, DialogFragment, BottomSheetDialogFragment 및 Lifecycle-aware 구성 요소와의 통합이 포함됩니다. 2026년부터 Google은 Fragment를 직접 사용하지 않고 Jetpack Navigation을 통해서만 사용할 것을 권장합니다.
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@+id/listFragment">
<fragment
android:id="@+id/listFragment"
android:name=".ListFragment"
android:label="목록">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="세부 정보" />
</navigation>자주 묻는 질문
FragmentManager는 프래그먼트 트랜잭션을 관리하는 클래스입니다. Activity 컨테이너에서 프래그먼트를 추가, 제거 및 교체합니다. FragmentManager는 Activity 재생성 시 프래그먼트 상태를 복원하고 백 스택을 관리합니다.
Fragment는 Activity 내 UI의 일부로, 독립적으로 존재할 수 없습니다. Fragment는 화면 회전 시 Activity 재생성에서 살아남습니다. Activity는 자체 Lifecycle을 가진 전체 화면이며, Fragment는 Activity의 Lifecycle에 의존합니다.
Fragment — 화면이 여러 독립 블록(탭, 마스터-디테일, 태블릿 적응)으로 구성된 경우. Activity — 화면에 반복 가능한 블록이 없는 경우. Google은 Single Activity + 다중 Fragment를 권장합니다.
세 가지 방법: 부모 Activity를 통해(공유 ViewModel), Fragment Result API(setFragmentResult)를 통해, Fragment 생성 시 Bundle 인수를 통해. ViewModel은 재생성 중에도 데이터가 보존되므로 선호되는 방법입니다.
Fragment Transaction은 프래그먼트 세트를 변경하는 원자적 연산입니다. FragmentManager.beginTransaction()은 add, remove, replace, hide, show를 호출할 수 있는 트랜잭션을 엽니다. 각 트랜잭션은 commit() 또는 commitNow()로 종료됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.