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를 써야할 때
- compose 내부에서 상태를 유지할 때 → remember { mutableStateOf(...) }
- UI에 영향을 주는 상태를 저장할 때
- 다음 recomposition에서도 값이 유지되어야 할 때