본문 바로가기
Android

안드로이드 UI의 진화: ListView에서 RecyclerView, 그리고 Compose 까지 [Part.3 LazyColumn]

by 중곰 2025. 2. 4.

 

안녕하세요. 중곰입니다.

 

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의 한계

  1. 성능 저하
    • findViewById 호출이 빈번하여 속도가 느림.
    • ViewHolder 패턴을 적용하지 않으면 재사용이 불가능해 메모리 낭비.
  2. 유연성 부족
    • 세로 방향 리스트만 지원(Grid, Staggered 등 확장성 부족).
  3. 전체 갱신 문제
    • notifyDataSetChanged()를 호출하면 전체 리스트를 다시 그림(비효율적).

2. RecyclerView

RecyclerView란?

  • ListView의 단점을 보완한 리스트 UI 컴포넌트.
  • ViewHolder 패턴을 내장하여 뷰 재사용 최적화.
  • 다양한 레이아웃 매니저(Linear, Grid, Staggered) 제공.

RecyclerView의 특징

  1. 성능 최적화
    • ViewHolder 패턴을 내장하여 findViewById 호출을 최소화.
    • notifyItemChanged() 등 부분 갱신이 가능해 효율적.
  2. 유연한 레이아웃
    • LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager 지원.
  3. 애니메이션 & 확장성
    • ItemAnimator를 활용하여 아이템 추가/삭제 애니메이션 지원.

RecyclerView의 한계

  1. 초기 설정 복잡
    • Adapter, ViewHolder, LayoutManager를 직접 구현해야 함.
  2. 선언형 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 데이터를 표현할 수 있는 방법에 대해 간단하게 살펴 보았습니다.

읽어주셔서 감사합니다.

반응형