[안드로이드] 02. remember, rememberSaveable

wasingun·2025년 3월 4일

remember란?

remember는 Jetpack Compose의 상태 관리 시스템에서 중요한 역할을 하는 함수로, Composable 함수 내에서 값을 생성하고 기억하는 데 사용됩니다. remember를 사용하면 해당 값이 Composable이 재구성(리컴포지션)될 때 유지되므로, Composable이 활성화되어 있는 동안 상태를 보존할 수 있습니다.

예제: remember를 활용한 상태유지

@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }
    Button(
        onClick = { count++ }
    ) {
        Text(text = "Increment Counter")
    }
    Text(text = "Count: $count")
}

위 코드에서 count 변수는 remember를 사용하여 저장되므로, Composable이 재구성되더라도 값이 유지됩니다. 하지만 화면회전과 같은 구성변경시엔 데이터가 유지되지 않습니다.

rememberSaveable이란?

반면, rememberSaveable은 화면 회전 또는 기기 방향 변경과 같은 구성 변경이 발생해도 상태를 유지하는 기능을 제공합니다. 만약 구성 변경이 일어나면, remember를 사용한 상태는 사라지지만, rememberSaveable을 사용하면 상태를 자동으로 저장하고 복원할 수 있습니다.

예제: rememberSaveable을 활용한 상태유지

@Composable
fun RememberSaveableExample() {
    val savedText by rememberSaveable { mutableStateOf("Initial Text") }
    TextField(
        value = savedText,
        onValueChange = { newText ->
            savedText.value = newText
        }
    )
    Text(text = "Text Entered: $savedText")
}

위 코드에서 사용자가 TextField에 입력한 값은 rememberSaveable을 사용하여 저장됩니다. 이렇게 보면 rememberSaveable과 비슷해 보이지만, 화면회전과 같은 구성변경 발생시에도 rememberSaveable은 상태를 유지합니다.

rememberSaveable만 써도 되지않을까?

얼핏보면 rememberSaveable이 remember의 기능을 대체할 것 같기 때문에 굳이 remember를 써야하나 싶기도 하겠지만, remember는 메모리에만 데이터를 저장하는데 비해 rememberSaveable은 Bundle에 저장한다는 점에서 차이가 발생한다. 아래와 같은 점을 고려하여 remember와 rememberSaveable을 구분하여 사용하길 권합니다.

여기서 차이점을 이해하기 전에, Bundle에 대한 설명을 아래와 같이 설명을 적어놨습니다.

  1. Bundle이란?
    Bundle은 Android에서 데이터를 저장하고 전달할 때 사용하는 키-값(key-value) 형태의 데이터 컨테이너입니다.
  • Android 시스템에서 Activity나 Fragment의 상태를 저장할 때 사용합니다.
  • 내부적으로 onSaveInstanceState()를 통해 자동 저장되며, 화면 회전 후 onRestoreInstanceState()를 통해 복원됩니다.
  • Parcelable 또는 기본 데이터 타입(Int, String 등)만 저장 가능합니다.

1. 성능

  • remember는 메모리에만 저장을 하는 반면에, rememberSaveable의 경우 Bundle에 저장하고 복원하는 과정이 있기 때문에 약간의 오버헤드가 발생

2. 데이터 타입 제한

  • remember는 데이터를 저장할 때 특별히 타입에 대한 제한을 받지 않지만, rememberSaveable의 경우엔 Bundle에 저장 가능한 타입으로만 제한된다. (Parelable 또는 Serializable을 통해 저장할 수도 있긴 함)

이러한 이유 때문에, remember만으로도 충분한 상황에서 불필요하게 rememberSaveable을 쓸 필요는 없다. 상황에 따라 remember와 rememberSaveable을 적절히 활용하는것이 좋다.

주요 사용목적

remember

  • 구성 변경이 없을때, 또는 구성이 변경되었을 때 굳이 상태를 유지할 필요가 없을 때
  • 성능을 고려한다면 꼭 구성변경 때 상태를 유지할 필요가 없다면 remember를 쓰는것이 적합

rememberSaveable

  • 구성 변경이 일어났을 때에도 상태를 유지해야 할 때
  • 구성 변경 발생시 사용자 편의성을 고려하여 상태를 유지해야 한다면 rememberSaveable을 쓰는것이 적합
profile
안드로이드 개발을 공부하는 아저씨 입니다.

0개의 댓글