android studio

[Android] remember / mutableStateOf 사용법 (Jetpack Compose)

a00896 2025. 2. 18. 23:02

remember 기본 사용법

 - 컴포저블이 재구성될 때 상태를 유지하는데 사용

  • remember는 컴포저블이 다시 실행될 때 값이 초기화되지 않도록 상태를 저장하는 역할을 함
  • remember없이 mutableStateOf를 사용하면, 상태가 유지되지 않는다.
@Composable
fun RememberExample() {
    var name by remember { mutableStateOf("Hello") }

    Column {
        Text(text = name)
        Button(onClick = { name = "Changed!" }) {
            Text("Change Text")
        }
    }
}

 - remember 덕분에 name 값이 유지되며, 버튼을 누르면 정상적으로 업데이트 된다.

 

 

mutableStateOf 기본 사용법

 - Compose에서 UI 변경을 감지하는 상태(State) 객체

  • 일반 변수(var)와 다르게, 값이 변경되면 UI가 자동으로 다시 그림(Recomposition)
  • 하지만 mutableStateOf만 사용하면 상태가 유지되지 않는다.
@Composable
fun Counter() {
    var count = mutableStateOf(0)  // ❌ remember 없이 사용

    Column {
        Text("Count: ${count.value}")
        Button(onClick = { count.value++ }) {
            Text("Increment")
        }
    }
}

 

 - count는 매번 새로운 값이 할당되므로, 버튼을 눌러도 화면이 다시 그려질 때 값이 유지되지 않는다.

 - 해결방법: remember와 함께 사용한다.

@Composable
fun Counter() {
    var count = remember { mutableStateOf(0) }  // ✅ remember 추가

    Column {
        Text("Count: ${count.value}")
        Button(onClick = { count.value++ }) {
            Text("Increment")
        }
    }
}

 - remember가 mutableStateOf(0)를 감싸고 있어서 재구성(Recomposition)이 발생해도 값이 유지된다. 

 

 

remember 없이 상태가 유지되는 경우

  • remember는 Composable 내부에서 사용할 때만 필요, ViewModel에서는 사용하지 않는다.
  • ViewModel은 Activity/Fragment가 재생성되어도 상태가 유지되므로, mutableStateOf 만 사용 가능하다.

ViewModel에서 mutableStateOf만 사용

class CounterViewModel : ViewModel() {
    var count by mutableStateOf(0)  // ✅ remember 필요 없음

    fun increment() {
        count++
    }
}

@Composable
fun CounterScreen(viewModel: CounterViewModel = viewModel()) {
    Column {
        Text("Count: ${viewModel.count}")
        Button(onClick = { viewModel.increment() }) {
            Text("Increment")
        }
    }
}

 - ViewModel은 컴포저블이 재구성되어도 값이 유지되므로, mutableStateOf만 사용하면 된다.

 

 

정리

 

  • Compose 내부에서 상태를 관리할 때는 remember { mutableStateOf(...) }를 기본적으로 사용
  • ViewModel에서는 remember 없이 mutableStateOf만 사용 가능
  • mutableStateOf만 단독으로 사용하면 상태가 유지되지 않으므로 반드시 remember를 감싸야 함

 

개념 설명 사용 위치
remember 상태가 Recomposition 되어도 유지되도록 저장 Compose 내부에서 mutableStateOf 와 함께 사용
mutableStateOf 상태가 변경되면 UI가 다시 그림(Recomposition) Compose 내부, ViewModel

 

remember를 써야할 때

  1. compose 내부에서 상태를 유지할 때 → remember { mutableStateOf(...) }
  2. UI에 영향을 주는 상태를 저장할 때
  3. 다음 recomposition에서도 값이 유지되어야 할 때