0Pricing
Android Academy · 강의

프래그먼트

프래그먼트로 모듈형 UI를 구축합니다. 프래그먼트 수명 주기, 프래그먼트에서의 ViewBinding, 인수 전달, 백 스택 관리 및 프래그먼트와 액티비티 간 통신을 배웁니다.

프래그먼트은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 7개 중 6번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 7개의 강의가 포함되어 있습니다.

프래그먼트란 무엇인가요?

프래그먼트는 Activity 안에서 동작하는 재사용 가능한 UI 모듈입니다. 자체 레이아웃, 수명 주기, 로직을 가진 하위 Activity라고 생각하면 됩니다.

프래그먼트를 사용하는 이유는 무엇일까요?

  • 여러 Activity에서 UI 재사용
  • 휴대전화와 태블릿에 서로 다른 레이아웃 처리
  • 여러 Activity 없이 여러 화면 흐름 구성
  • Navigation Component와 자연스럽게 연동

프래그먼트 수명 주기

프래그먼트에는 Activity 수명 주기와 함께 실행되는 자체 수명 주기가 있습니다. 주요 콜백은 다음과 같습니다.

  • onAttach — 프래그먼트가 Activity에 연결됩니다
  • onCreate — 프래그먼트가 생성됩니다(아직 뷰는 없음)
  • onCreateView — 레이아웃을 인플레이트합니다
  • onViewCreated — 뷰가 준비되며, 여기서 UI를 설정합니다
  • onDestroyView — 뷰가 제거됩니다(뷰 참조를 해제합니다)
  • onDetach — 프래그먼트가 분리됩니다

프래그먼트 만들기

Fragment를 확장하는 클래스를 만들고, onCreateView를 재정의하여 레이아웃을 인플레이트합니다.

import androidx.fragment.app.Fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

class HomeFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }
}

프래그먼트에서 ViewBinding 사용하기

프래그먼트에서 ViewBinding을 사용하되, 메모리 누수를 방지하려면 onDestroyView에서 바인딩을 해제하세요.

class HomeFragment : Fragment() {

    private var _binding: FragmentHomeBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.tvTitle.text = "Welcome!"
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null   // prevent memory leak
    }
}

프래그먼트 레이아웃 XML

Activity 레이아웃과 같은 방식으로 res/layout/fragment_home.xml을 만듭니다. 루트 뷰가 프래그먼트의 뷰가 됩니다.

<!-- res/layout/fragment_home.xml -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:text="Home" />

</LinearLayout>

Activity에 프래그먼트 추가하기

Activity에 프래그먼트를 추가하는 방법은 두 가지입니다.

  • 정적(XML) — <fragment> 태그로 레이아웃에 선언합니다. 실행 중에는 변경할 수 없습니다.
  • 동적(코드) — FragmentManager와 트랜잭션을 사용합니다. 실행 중에 교체할 수 있습니다.
<!-- Static: in activity_main.xml -->
<fragment
    android:id="@+id/homeFragment"
    android:name="com.example.HomeFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

동적 프래그먼트 트랜잭션

supportFragmentManager를 사용하여 실행 중에 프래그먼트를 추가, 교체 또는 제거합니다.

// In Activity:
class MainActivity : AppCompatActivity(R.layout.activity_main) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .add(R.id.fragmentContainer, HomeFragment())
                .commit()
        }
    }

    fun showDetail(id: Int) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragmentContainer, DetailFragment.newInstance(id))
            .addToBackStack(null)  // allow back navigation
            .commit()
    }
}

프래그먼트에 인수 전달하기

컴패니언 객체 팩토리 패턴을 사용하여 Bundle로 데이터를 전달합니다. 매개변수가 있는 프래그먼트 생성자는 사용하지 마세요. 구성 변경 후 Android가 인수가 없는 생성자로 프래그먼트를 다시 만들기 때문입니다.

class DetailFragment : Fragment() {

    companion object {
        private const val ARG_ID = "item_id"

        fun newInstance(itemId: Int): DetailFragment {
            return DetailFragment().apply {
                arguments = Bundle().apply {
                    putInt(ARG_ID, itemId)
                }
            }
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val itemId = requireArguments().getInt(ARG_ID)
        // use itemId to load data
    }
}

프래그먼트 → Activity 통신

프래그먼트에서 인터페이스를 정의하고 Activity에서 구현합니다. 프래그먼트는 onAttach를 통해 참조를 가져옵니다.

class ListFragment : Fragment() {

    interface OnItemSelected {
        fun onItemSelected(id: Int)
    }

    private var listener: OnItemSelected? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        listener = context as? OnItemSelected
    }

    private fun handleClick(id: Int) {
        listener?.onItemSelected(id)
    }

    override fun onDetach() {
        super.onDetach()
        listener = null
    }
}

백 스택

트랜잭션에서 addToBackStack(null)을 호출하면 뒤로 가기를 눌렀을 때 스택에서 프래그먼트가 제거됩니다.

  • addToBackStack을 사용하지 않으면 — 뒤로 가기 시 Activity가 종료됩니다
  • addToBackStack을 사용하면 — 뒤로 가기 시 이전 프래그먼트로 돌아갑니다
  • 프로그래밍 방식으로 뒤로 이동하려면 popBackStack()을 사용합니다

컨테이너 안의 프래그먼트

Activity 레이아웃에는 컨테이너 뷰만 있으면 됩니다. 일반적으로 ID가 있는 FrameLayout을 사용합니다. 프래그먼트가 해당 컨테이너를 채웁니다.

<!-- activity_main.xml -->
<FrameLayout
    android:id="@+id/fragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

빠른 확인

프래그먼트에 생성자 인수를 전달하지 말고 컴패니언 팩토리를 통해 Bundle을 사용해야 하는 이유는 무엇인가요?

복습: 프래그먼트

프래그먼트는 현대적인 Android UI를 구성하는 기본 요소입니다.

  • Fragment를 확장하고 onCreateView에서 레이아웃을 인플레이트합니다
  • onViewCreated에서 UI를 설정합니다
  • onDestroyView에서 ViewBinding을 해제합니다
  • Bundle과 컴패니언 팩토리(newInstance)를 통해 데이터를 전달합니다
  • 뒤로 이동하려면 addToBackStack을 사용합니다
  • 인터페이스를 통해 Activity와 통신합니다

다음: 실행 중에 위험한 권한을 요청합니다.

자주 묻는 질문

“프래그먼트” 강의는 무료인가요?

네 — “프래그먼트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 7개의 강의가 포함되어 있습니다.

“프래그먼트”에서 뭘 배우나요?

프래그먼트로 모듈형 UI를 구축합니다. 프래그먼트 수명 주기, 프래그먼트에서의 ViewBinding, 인수 전달, 백 스택 관리 및 프래그먼트와 액티비티 간 통신을 배웁니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Android Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 7개 중 6번째 강의입니다.

“프래그먼트” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 프로젝트 구조 및 매니페스트
  2. 액티비티 및 수명 주기
  3. 레이아웃 및 뷰
  4. 사용자 입력 처리
  5. 인텐트 및 탐색
  6. 프래그먼트
  7. 권한 및 런타임 요청
← Android Academy(으)로 돌아가기