본문 바로가기
카테고리 없음

Jetpack Compose key() 함수: 재구성 최적화와 상태 유지 방법

by h4r3 2025. 2. 18.
반응형

 

Jetpack Compose의 key() 함수는 컴포저블의 재구성을 최적화하고 상태를 유지하는 데 중요한 역할을 합니다. 특히, LazyColumn과 같은 리스트에서 아이템의 상태를 보존하고 불필요한 재구성을 방지하는 데 유용합니다. 이번 글에서는 key() 함수의 개념, 사용법, 그리고 실제 효과를 설명합니다.

 


 

1. key() 함수란?

key() 함수는 Jetpack Compose에서 특정 키 값을 기반으로 컴포저블의 상태를 유지하거나 초기화하는 역할을 합니다.

컴포저블이 재구성될 때, 키가 동일하면 기존 상태를 유지하고, 키가 변경되면 새로운 상태로 초기화됩니다.

 

key() 함수 시그니처

@Composable
public inline fun <T> key(
    @Suppress(names = {"UNUSED_PARAMETER"}) vararg keys: Any?,
    block: @Composable () -> T
): T

 

매개변수 설명

매개변수 설명

keys 상태를 유지할 기준이 되는 키 값(여러 개 가능)
block key() 내부에서 실행될 컴포저블 블록

2. key() 함수의 효과

컴포저블의 상태 유지

  • 키가 변경되지 않으면 기존 상태를 유지합니다.
  • 키가 변경되면 새로운 상태가 생성됩니다.

리스트 아이템의 상태 보존

  • LazyColumn에서 아이템의 위치가 변경되어도 상태를 유지할 수 있습니다.

불필요한 재구성 방지

  • 동일한 키를 가진 컴포저블은 재구성이 최소화되어 성능이 향상됩니다.

 


 

3. key() 함수 사용 예제

1️⃣ 키가 동일할 때 상태 유지

@Composable
fun CounterExample() {
    var counter by remember { mutableStateOf(0) }

    Column {
        key(1) { // 키가 1로 고정 → 상태 유지됨
            Button(onClick = { counter++ }) {
                Text("Count: $counter")
            }
        }
    }
}

결과: 버튼을 클릭해도 counter 값이 유지됩니다.

 


 

2️⃣ 키가 변경될 때 상태 초기화

@Composable
fun ChangingKeyExample(switch: Boolean) {
    Column {
        key(switch) { // switch 값이 변경되면 새로운 상태가 생성됨
            var counter by remember { mutableStateOf(0) }
            Button(onClick = { counter++ }) {
                Text("Count: $counter")
            }
        }
    }
}

결과: switch 값이 변경되면 counter가 초기화됩니다.

 


 

3️⃣ LazyColumn에서 리스트 아이템 상태 유지

@Composable
fun NameList(names: List<String>) {
    LazyColumn {
        items(names, key = { it }) { name -> // 아이템의 고유한 키를 설정
            key(name) { // 동일한 키가 유지되면 상태도 유지됨
                var expanded by remember { mutableStateOf(false) }
                Text(
                    text = name,
                    modifier = Modifier
                        .fillMaxWidth()
                        .clickable { expanded = !expanded }
                        .background(if (expanded) Color.Gray else Color.White)
                )
            }
        }
    }
}

결과: 리스트에서 아이템이 이동해도 기존 상태(배경색 등)가 유지됩니다.

 


 

4. key() 함수가 필요한 이유

상황 key() 사용 효과

컴포저블의 상태 유지 키가 변경되지 않으면 기존 상태 유지
리스트 아이템 상태 유지 아이템의 이동이나 추가/삭제에도 상태 유지
불필요한 재구성 방지 성능 최적화 및 부드러운 UI 제공

 


 

5. key() 함수 사용 시 주의할 점

  • 고유한 키를 설정해야 함
    • 리스트에서 key()를 사용할 때는 **중복되지 않는 고유한 값(예: ID, UUID)**을 키로 사용해야 합니다.
    • 잘못된 예시: key(position), key(index)
    • 올바른 예시: key(item.id), key(item.name)
  • 키가 불필요하게 변경되지 않도록 주의
    • key()의 키가 불필요하게 변경되면 컴포저블이 다시 생성되어 성능이 저하될 수 있습니다.

 


 

6. 결론

  • key()는 컴포저블의 상태를 유지하거나 초기화하는 기준을 설정하는 역할을 합니다.
  • LazyColumn에서 아이템의 상태를 보존할 때 필수적으로 사용됩니다.
  • 불필요한 재구성을 줄여 성능을 최적화하는 데 효과적입니다.

💡 리스트나 동적인 UI를 만들 때 key()를 적극 활용하면 Jetpack Compose의 성능을 향상시킬 수 있습니다!

반응형

 

반응형