#1 ๊ฐ์
์ํ ๋ฐ Jetpack Compose | Android Developers
์ด ํ์ด์ง๋ Cloud Translation API๋ฅผ ํตํด ๋ฒ์ญ๋์์ต๋๋ค. ์ํ ๋ฐ Jetpack Compose ์ปฌ๋ ์ ์ ์ฌ์ฉํด ์ ๋ฆฌํ๊ธฐ ๋ด ํ๊ฒฝ์ค์ ์ ๊ธฐ์ค์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฅํ์ธ์. ์ฑ์ ์ํ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ
developer.android.com
State๊ฐ ๊ฐ์ง๋ ์์น ์ ์ฝ ๊ทธ๋ฆฌ๊ณ ํด๋น ์ ์ฝ์ ํด์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ณธ๋ค.
#2 ์ฝ๋
#2-1 ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ฝ๋ (State object์ ์์น ์ ์ฝ)
@Composable
fun ButtonExample(modifierParam: Modifier = Modifier) {
val count = mutableStateOf(0)
Button(
onClick = {
Log.i("interfacer_han", "Current count value: ${++count.value}")
}, modifier = modifierParam
) {
Text(
text = "Count: ${count.value}", fontSize = 40.sp
)
}
}
State๋ฅผ ๊ฐ์ง๊ณ ์๋ Composable์ด๋ค. ํ์ง๋ง ์ด ์ฝ๋๋ "Creating a state object during composition without using remember" ๋ผ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฑ์ด๋ธ๋ค. 'remember'๊ฐ ๋ฌด์์ธ์ง๋ ์๋์์ ์ค๋ช
ํ๊ณ , ๋จผ์ ์ ์ด๋ฐ ์๋ฌ ๋ฉ์์ง๊ฐ ๋์๋ ์ง๋ฅผ ์์์ผ ํ๋ค. State์ ๋ํด ๋ค๋ฃฌ ์ด ๊ฒ์๊ธ์์ ๋ณด๋ฏ, State๊ฐ ๋ณํ๋ฉด ํด๋น State์ ์ฐ๊ด๋ Composable์ ๋ค์ ๋ก๋(์ฌ๊ตฌ์ฑ, recomposition)ํ๋ค. Composable์ด ๋ค์ ๋ก๋๋๋ฉด ๊ทธ ์์ State๋ ๋ค์ ์ด๊ธฐํ๋๋ค. ๋ฌดํ ๋ฃจํ์ ๋น ์ง๊ณ ๋ง๋ค. ์ฆ, State๋ Composable ๋ด๋ถ์ ์์นํ ์ ์๋ค๋ ์ผ์ข
์ ์์น ์ ์ฝ์ ๊ฐ์ง๋ค.
์ฌ๋ด์ผ๋ก, ์ ์ด์ count๋ฅผ Composable์์ ๋นผ ์ ์ญ ๋ณ์๋ก ๋๋ฉด ๊ทธ๋ง์ด์ง ์๋๋ ์๊ฐ๋ ๋ค ์ ์๋ค. ํ์ง๋ง, ์ด๋ Jetpack Compose์์ ๊ถ์ฅ๋์ง ์๋ ๋ฐฉ์์ด๋ค. ์๋ํ๋ฉด Composable๋ค์ ๋
๋ฆฝ์ ์ผ๋ก ์ฌ๊ตฌ์ฑ(recomposition)๋๊ธฐ ๋๋ฌธ์ด๋ค. ์์ ์ฝ๋์์๋ ButtonExample() ๋จ ํ๋์ Composable๋ง ์กด์ฌํ์ง๋ง, ์ค์ ํ๋ก์ ํธ์์๋ ์ ๋ง์ Composable์ด ์กด์ฌํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๊ทธ ์ํฉ์์ ์ ์ญ ๋ณ์๋ก State๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ค์ (UI ์ ์ง๋ณด์ ๋ฉด์์) ๊ฐ๋นํ๊ธฐ ํ๋ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง ์ฌ์ง๋ฅผ ๋ณ๊ฒ ๋๋ค. ํ์ง๋ง State๊ฐ ์๋์ ๊ณง ๋์ฌ ํด๊ฒฐ๋ฒ์ ์ํด Composable์ ์๋ฌ ์์ด ๋ค์ด๊ฐ ์์๊ฒ ๋๋ค๊ณ ํด๋ ์ด ๋ํ ์ฌ์ ํ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ค. ๊ทธ ์ด์ ๋ ์ด์ด์ง๋ ๊ฒ์๊ธ(State Hoisting) ์ฐธ์กฐ.
#2-2 remember๋ฅผ ํตํ ํด๊ฒฐ (State object์ ์์น ์ ์ฝ ํด์)
@Composable
fun ButtonExample(modifierParam: Modifier = Modifier) {
val count = remember {
mutableStateOf(0)
}
Button(
onClick = {
Log.i("interfacer_han", "Current count value: ${++count.value}")
}, modifier = modifierParam
) {
Text(
text = "Count: ${count.value}", fontSize = 40.sp
)
}
}
ํด๊ฒฐ๋ฒ์ #2-1์ ์๋ฌ ๋ฉ์์ง์์ ๋ณด๋ฏ, ๊ทธ๋ฅ remember { ... }๋ก State๋ฅผ ๊ฐ์ธ๋ฒ๋ฆฌ๋ฉด ๋๋ค. remember๋ Composable ๋ด์์๋ง ์ฌ์ฉํ ์ ์๋ ํจ์์ธ๋ฐ, State๋ฅผ ๋ณ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ, recomposition์ด ์ผ์ด๋๋ ๊ทธ ๊ฐ์ด ์ด๊ธฐํ๋์ง ์๊ฒ ๋ง๋ ๋ค. ํ ๋ง๋๋ก remember๋ ์ฌ๊ตฌ์ฑ(recomposition)์ ๋ํ ๋ณดํธ๋ง์ด๋ค.
๊ธฐ์ตํด์ผํ ๊ฒ์ remember { ... }๋ก ๊ฐ์ธ๋ ๋์์ด State ํ๋กํผํฐ๊ฐ ์๋๋ผ, State ๊ฐ์ฒด(Object)๋ผ๋ ๋น์ฐํ ์ฌ์ค์ด๋ค. ์ฆ, ํ๋กํผํฐ์ธ count๊ฐ ์๋๋ผ ์ธ์คํด์ค์ธ mutableStateOf(0)๋ฅผ remember { ... }๋ก ๊ฐ์ผ๋ค. State ํ๋กํผํฐ๋ Jetpack Compose ๋ฐํ์์ ์ํด ์ด์ฐจํผ ํญ์ ๊ทธ value๊ฐ์ด ๊ธฐ์ต๋๊ณ ๋ชจ๋ํฐ๋ง๋๋ค. ๊ทธ๋์ผ State ํ๋กํผํฐ์ value ์์ฑ์ด ๋ณํ ๋, ์์์ ์ผ๋ก Recomposition์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ State object๋ ๊ทธ๋ ์ง ์๋ค. ๋ฐ๋ผ์ ๋ช
์์ ์ผ๋ก remember { ... }๋ก ๊ฐ์ธ๋ ์ฒ๋ฆฌ๊ฐ ์๊ตฌ๋๋ ๊ฒ์ด๋ค.
#2-3 rememberSaveable
@Composable
fun ButtonExample(modifierParam: Modifier = Modifier) {
val count = rememberSaveable {
mutableStateOf(0)
}
Button(
onClick = {
Log.i("interfacer_han", "Current count value: ${++count.value}")
}, modifier = modifierParam
) {
Text(
text = "Count: ${count.value}", fontSize = 40.sp
)
}
}
rememberSaveable์ remember์ ์ฌํํ์ด๋ผ๊ณ ํ ์ ์๋ค. remember๋ recomposition์ ๋ง์๋ด์ง๋ง ํ๋ฉด ํ์ ๋ฑ์ผ๋ก onCreate()๊ฐ ๋ค์ ์คํ๋๋ ๊ฒฝ์ฐ์๋ State์ ์ด๊ธฐํ๋ฅผ ๋ง์ ์ ์๋ค. ๋ค์ ๋งํ์๋ฉด, View ์์ฒด๊ฐ ํ๊ดด๋๋ ๊ฒฝ์ฐ๋ ๋ง์ ์ ์๋ค. rememberSaveable์ ์ด ๊ฒฝ์ฐ(View์ ํ๊ดด ๋ฐ ์ฌ์์ฑ)์๋ State๊ฐ ์ด๊ธฐํ๋์ง ์๊ฒ ๋ฐฉ์ดํ๋ค. ํ์ง๋ง, ๋จ๋ฐํด์๋ ์ ๋๋ค. ์งง์ ์ฝ๋๋ผ๋ฉด ๋ชจ๋ฅผ๊น, ์ฝ๋๊ฐ ๊ธธ์ด์ง ๋ ๊ทธ๋ฅ ViewModel์ ์ฐ๋ ๊ฒ ์ต์ ์ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
#3 ์๋ ํ์ธ (rememberSaveable์ ์ฌ์ฉํ ๊ฒฝ์ฐ)

rememberSaveable๊ฐ ์๋๋ผ remember๋ฅผ ์ผ๋ค๋ฉด, ํ๋ฉด ํ์ ์ ๊น์ง๋ ์ ๋์ํ๊ฒ ์ง๋ง, ํ๋ฉด ํ์ ์ด ๋๊ณ ๋์๋ count.value๊ฐ 0์ผ๋ก ์ด๊ธฐํ๋๋ค.
#4 ์์ฝ
remember๋ ์ฌ๊ตฌ์ฑ(recomposition)์ ๋ํ ๋ณดํธ๋ง์ด๋ค.
#5 ์์ฑ๋ ์ฑ
android-practice/jetpack-compose/StateRemembering at master ยท Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Jetpack Compose - ViewModel์์ State ์ฌ์ฉํ๊ธฐ (0) | 2024.07.23 |
---|---|
[Android] Jetpack Compose - State Hoisting (0) | 2024.07.23 |
[Android] Jetpack Compose - State ๊ธฐ์ด (0) | 2024.07.22 |
[Android] Jetpack Compose - Lazy Column (0) | 2024.07.22 |
[Android] Jetpack Compose - Button (0) | 2024.07.22 |