
안녕하세요. 중곰입니다.
Part.3 LazyColumn 입니다.
이미 많은 블로그에서도 Compose LazyColumn을 많이 다루었지만,
한번 정리하기 위해 작성되었습니다.
Part.2 RecyclerView 를 보신다면
아래 링크를 참조하시길 바래요.
안드로이드 UI의 진화: ListView에서 RecyclerView, 그리고 Compose 까지 [Part.2 RecyclerView]
안녕하세요. 중곰입니다. Part.2 RecyclerView 입니다. 이미 많은 블로그에서 RecyclerView를 잘 다뤄주었지만,한번 더 정리하기 위한 목적으로 작성되었습니다. 그럼 RecyclerView를 살펴봅니다.Part.1 ListVi
medium-23-pieces.tistory.com
LazyColumn
LazyColumn 은 최신 Jetpack Compose 기반 리스트 구현 방식으로, 성능 최적화와 간결한 코드 작성을 지원합니다.
앞서 Part.1 ListView, Part.2 RecyclerView를 간단하게 살펴 보고 이어가봅니다.
1. ListView
ListView란?
- 안드로이드에서 가장 오래된 리스트 UI 컴포넌트.
- Adapter를 사용하여 데이터를 뷰에 바인딩.
- 간단한 리스트를 쉽게 만들 수 있지만, 성능 및 유연성이 제한적.
ListView의 한계
- 성능 저하
- findViewById 호출이 빈번하여 속도가 느림.
- ViewHolder 패턴을 적용하지 않으면 재사용이 불가능해 메모리 낭비.
- 유연성 부족
- 세로 방향 리스트만 지원(Grid, Staggered 등 확장성 부족).
- 전체 갱신 문제
- notifyDataSetChanged()를 호출하면 전체 리스트를 다시 그림(비효율적).
2. RecyclerView
RecyclerView란?
- ListView의 단점을 보완한 리스트 UI 컴포넌트.
- ViewHolder 패턴을 내장하여 뷰 재사용 최적화.
- 다양한 레이아웃 매니저(Linear, Grid, Staggered) 제공.
RecyclerView의 특징
- 성능 최적화
- ViewHolder 패턴을 내장하여 findViewById 호출을 최소화.
- notifyItemChanged() 등 부분 갱신이 가능해 효율적.
- 유연한 레이아웃
- LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager 지원.
- 애니메이션 & 확장성
- ItemAnimator를 활용하여 아이템 추가/삭제 애니메이션 지원.
RecyclerView의 한계
- 초기 설정 복잡
- Adapter, ViewHolder, LayoutManager를 직접 구현해야 함.
- 선언형 UI 미지원
- 명령형 방식으로 상태 관리가 필요하며, Compose 대비 코드가 길어질 수 있음.
앞서 리스트를 표현하는 View를 살펴보았으니,
그럼 Compose LazyColumn 에 대해 살펴 보겠습니다.
LazyColumn 이란?
- Jetpack Compose 에서 리스트를 구현하는 방식
- RecyclerView를 대체할 수 있는 선언형 UI 방식
- 리스트의 성능 최적화를 자동으로 수행
특징
- 선언형 UI
- 기존 XML + Adapter 방식이 아니라, 코드 내에서 리스트를 직접 선언
- 상태 기반 재구성 (Recomposition)
- 변경된 부부만 다시 그려 성능 최적화
- 뷰 재사용 불필요
- Compose 내부적으로 상태를 관리하여, ViewHolder 없이도 효율적인 랜더링 가능
- 애니메이션 & 확장성
- Modifier.animateItemPlacement() 등으로 간단히 애니메이션 추가 가능
주요 구성 요소
- LazyColum 리스트 UI 를 생성하는 기본 컨테이너
- items() 리스트 데이터를 순회하며 각 아이템을 UI 로 변환
- Modifier 패딩, 애니메이션 등의 스타일링을 적용
- State 관리 remember 를 활용하여 리스트 상태를 저장
예제 코드
@Composable
fun MyLazyColumnApp() {
val items = remember { mutableStateListOf("Item 1", "Item 2", "Item 3") }
LazyColumn(
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(items) { item ->
Text(
text = item,
fontSize = 18.sp,
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
}
}
}
RecyclerView vs LazyColumn 코드 비교
// RecyclerView
class MyAdapter(private val dataList: List<String>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(R.id.textView)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_layout, parent, false)
return MyViewHolder(view)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.textView.text = dataList[position]
}
override fun getItemCount(): Int = dataList.size
}
// LazyColumn
@Composable
fun MyLazyColumnApp() {
val items = listOf("Item 1", "Item 2", "Item 3")
LazyColumn(
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(items) { item ->
Text(
text = item,
fontSize = 18.sp,
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
)
}
}
}
마지막으로 한번 정리하면
ListView
- 간단하지만 성능이 떨어지며, 대량 데이터 처리 시 비효율적
RecyclerView
- ViewHolder 를 활용한 재사용 및 성능 최적화.
- notifyItemChanged() 로 부분 갱신 가능
LazyColumn (Compose)
- 상태 기반 재구성으로 가장 효율적
- 코드가 간결하고 유지보수성이 뛰어남
List 데이터를 표현할 수 있는 방법에 대해 간단하게 살펴 보았습니다.
읽어주셔서 감사합니다.
반응형
'Android' 카테고리의 다른 글
[Android] Navigation Component 살펴보기 (1) | 2025.02.20 |
---|---|
[Android] LiveData vs StateFlow: 안드로이드 상태 관리의 진화 (0) | 2025.02.05 |
안드로이드 UI의 진화: ListView에서 RecyclerView, 그리고 Compose 까지 [Part.2 RecyclerView] (6) | 2025.01.21 |
안드로이드 UI의 진화: ListView에서 RecyclerView, 그리고 Compose까지 [Part 1 ListView] (4) | 2025.01.21 |
Android UI Automator & Espresso 기반 UI 테스트 (4) | 2024.12.24 |