
Jetpack Compose를 공부하면서 LazyColumn을 접하게 되었습니다.
기존에는 리스트 성능을 최적화하려면 RecyclerView를 사용하고, 그때마다 Adapter와 ViewHolder를 직접 구현해야 했습니다.
그런데 LazyColumn을 사용하면 코드가 훨씬 간결해지면서도 자동으로 성능이 최적화된다는 점이 신기했습니다.
그래서 기존 RecyclerView와 비교하며 어떤 차이가 있는지 정리해보려고 합니다.
1. 기존 RecyclerView의 동작 방식
RecyclerView는 리스트의 성능을 최적화하기 위해
다음과 같은 요소들을 개발자가 직접 구현해야 합니다.
- Adapter → 리스트 데이터를 표시하는 역할
- ViewHolder → 뷰를 재사용하여 성능을 최적화
- LayoutManager → 리스트의 배치를 관리
RecyclerView 예제 (Adapter + ViewHolder 구현 필수)
class MyAdapter(private val items: List<String>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(R.id.textView)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.textView.text = items[position]
}
override fun getItemCount(): Int = items.size
}
이처럼 RecyclerView를 사용하려면 ViewHolder와 Adapter를 구현해야 하며,
스크롤 시 보이는 아이템만 유지하고 새로운 아이템을 동적으로 생성하여 성능을 최적화해야 합니다.
하지만 LazyColumn을 사용하면 이 모든 과정이 자동으로 처리됩니다.
2. LazyColumn은 어떻게 다를까?
LazyColumn은 RecyclerView에서 수동으로 구현해야 했던
뷰 재사용 및 성능 최적화 작업을 Jetpack Compose가 자동으로 처리해 줍니다.
@Composable
fun MyList() {
LazyColumn {
items(100) { index ->
Text(text = "Item #$index", modifier = Modifier.padding(16.dp))
}
}
}
이 코드만 작성하면 리스트가 자동으로 최적화됩니다.
따로 Adapter나 ViewHolder를 구현할 필요 없이,
Jetpack Compose가 보이는 부분만 렌더링하고 스크롤 시 필요한 아이템만 생성하여 성능을 최적화합니다.
즉, LazyColumn은 기존 RecyclerView에서 개발자가 직접 관리해야 했던
뷰 재사용 및 리스트 최적화 과정을 자동으로 처리하는 기능을 제공합니다.
3. LazyColumn이 RecyclerView보다 편리한 이유
LazyColumn이 자동으로 처리하는 기능
- 보이는 아이템만 렌더링하여 메모리 최적화
- ViewHolder 없이도 뷰 재사용을 자동으로 수행
- 별도의 Adapter 없이 리스트를 동적으로 관리 가능
- 스크롤 처리가 기본적으로 포함되어 있어 추가 작업이 필요 없음
즉, LazyColumn을 사용하면 기존 RecyclerView보다 코드가 훨씬 간결해지고,
성능 최적화도 Jetpack Compose가 자동으로 처리해 줍니다.
4. LazyColumn vs RecyclerView 비교
기능 | RecyclerView | LazyColumn |
뷰 재활용(ViewHolder) | 직접 구현 필요 | 자동으로 처리 |
Adapter 필요 여부 | 필수 | 필요 없음 |
레이아웃 관리(LayoutManager) | 설정 필요 | 자동으로 지원 |
스크롤 최적화 | 직접 최적화 필요 | 자동 최적화 |
코드 복잡도 | ViewHolder, Adapter 필요 | LazyColumn만 사용하면 됨 |
기존 RecyclerView에서는 성능을 최적화하기 위해 많은 추가 작업이 필요했지만,
LazyColumn을 사용하면 이러한 과정이 자동으로 처리되므로 개발자가 신경 써야 할 부분이 줄어듭니다.
5. LazyColumn 사용 예제
아이콘과 텍스트를 포함한 리스트 UI
@Composable
fun CustomList() {
LazyColumn {
items(10) { index ->
Row(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(imageVector = Icons.Default.Star, contentDescription = null)
Spacer(modifier = Modifier.width(8.dp))
Text(text = "Item #$index", fontSize = 20.sp)
}
}
}
}
위 예제에서는 Row를 사용하여 아이콘과 텍스트를 조합한 리스트 아이템을 생성하였습니다.
이처럼 LazyColumn을 활용하면 다양한 UI를 간결한 코드로 구현할 수 있습니다.
6. 결론: LazyColumn을 사용하면 좋은 점
- 기존 RecyclerView의 ViewHolder 역할을 자동으로 수행
- 보이는 항목만 렌더링하여 메모리 최적화
- Adapter, ViewHolder 없이 간결한 코드로 리스트 구현 가능
- 별도의 LayoutManager 설정 없이 자동으로 스크롤 지원
즉, LazyColumn을 사용하면 RecyclerView보다 훨씬 간단한 코드로 최적화된 리스트를 만들 수 있습니다.
Jetpack Compose의 LazyColumn은 RecyclerView의 최적화 기능을 유지하면서도 개발자가 직접 구현해야 했던 부분을 자동으로 처리해 줍니다.
androidx.compose.foundation.lazy | API reference | Android Developers
androidx.appsearch.builtintypes.properties
developer.android.com
'Android > Compose' 카테고리의 다른 글
[Android/Compose] collectAsState()를 활용한 상태 관리 (0) | 2025.03.20 |
---|---|
[Android/Compose] Jetpack Compose를 통해 살펴보는 선언형 UI와 명령형 UI의 차이 (0) | 2025.02.25 |
[Android/Compose] Recomposition: 상태 변화에 따른 UI 갱신 (0) | 2025.02.06 |
[Android/Compose] Modifier를 파라미터로 전달하는 이유 (0) | 2025.02.05 |
[Android/Compose] Spacer를 활용한 UI 요소 중앙 및 하단 배치 (0) | 2025.02.04 |