์ํ(State)๋
์ํ(State)๋
์ง๋ ๊ธ์์ ์ปดํผ์ ๋ธ์ ํจ์ํ ui๋ผ๊ณ ํ์์ง.
์ฝ๋ฐฑ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์์๋ก ์ฌ๋ฆฌ๋ ๊ฒ๊น์ง ๋ดค๋๋ฐ, ์ด๋ฒ์ ๋ฐ๋๋ก ์ปดํผ์ ๋ธ ์๊ธฐ ์์ ์ด ๋ญ๊ฐ๋ฅผ "๊ธฐ์ต"ํด์ผ ํ๋ ์ํฉ์ ๋ณด์.
์๋ฅผ ๋ค์ด ์ง๋๋ฒ GroupCard๋ฅผ ํด๋ฆญํ์ ๋, ์ ํ๋ ์นด๋๋ ํ ๋๋ฆฌ ์์ด ๋ฐ๋๊ฒ ํ๊ณ ์ถ๋ค๊ณ ํด๋ณด์.
kotlin
@Composable
fun GroupCard(
group: Group,
onClick: () -> Unit
) {
var isSelected = false
Card(
onClick = {
isSelected = true
onClick()
}
) {
// isSelected์ ๋ฐ๋ผ ํ
๋๋ฆฌ ์ ๋ค๋ฅด๊ฒ
}
}์ด๋ ๊ฒ ํ๋ฉด ๋ ๊ฒ ๊ฐ์ง?
๊ทผ๋ฐ ์ค์ ๋ก ๋๋ฌ๋ณด๋ฉด ํ ๋๋ฆฌ ์์ด ์ ๋ฐ๋๋ค.
์ ๊ทธ๋ด๊น? ์ด๊ฑธ ์ดํดํ๋ ค๋ฉด ๋จผ์ "๋ฆฌ์ปดํฌ์ง์ ์ด ์ธ์ , ์ ์ผ์ด๋๋์ง"๋ถํฐ ์์์ผ ํ๋ค.
๋ฆฌ์ปดํฌ์ง์ ์ ์ธ์ ์ผ์ด๋๋?
์ปดํฌ์ฆ๋ ์ปดํฌ์ ๋ธ ํจ์๋ฅผ ์ฒ์ ์คํํ ๋, ๊ทธ ํจ์ ์์์ ์ด๋ค ๊ฐ์ "์ฝ์๋์ง"๋ฅผ ๋ค ๊ธฐ๋กํด๋๋ค. ์ ํํ๋, State๋ผ๋ ํน๋ณํ ์ปจํ ์ด๋์ ๋ด๊ธด ๊ฐ์ ์ฝ์์ ๋๋ง ๊ธฐ๋กํ๋ค.
๋์ค์ ๊ทธ State์ ๊ฐ์ด ๋ฐ๋๋ฉด, ์ปดํฌ์ฆ๋ "์, ์ด ๊ฐ์ ์ฝ๊ณ ์๋ ํจ์๊ฐ ์์์ง. ์๋ฅผ ๋ค์ ๊ทธ๋ ค์ผ๊ฒ ๋ค"๊ณ ํ๋จํด์ ๊ทธ ํจ์๋ฅผ ๋ค์ ์คํํ๋ค. ์ด๊ฒ ๋ฆฌ์ปดํฌ์ง์ ์ด๋ค.
์ฆ ๋ฆฌ์ปดํฌ์ง์ ์ ์๋ฌด ๋๋ ์ผ์ด๋๋ ๊ฒ ์๋๋ผ, "State๋ก ์ ์ธ๋ ๊ฐ์ด ๋ฐ๋ ๋" ๊ทธ ๊ฐ์ ์ฝ๊ณ ์๋ ๋ถ๋ถ๋ง ์ฝ ์ง์ด์ ์ผ์ด๋๋ค.
๊ทธ๋ผ ์ ์ฝ๋๋ ์ ์ ๋์๊น?
var isSelected = false๋ ๊ทธ๋ฅ ํ๋ฒํ ์ฝํ๋ฆฐ ๋ณ์์ง, State๊ฐ ์๋๋ค. ์ปดํฌ์ฆ ์
์ฅ์์๋ ์ด ๊ฐ์ด ๋ฐ๋์๋์ง ์๋์ง ๊ฐ์ํ ๋ฐฉ๋ฒ์ด ์์ ์๋ค.
๊ทธ๋์ isSelected = true๋ก ๊ฐ์ ๋ฐ๊ฟ๋, ์ปดํฌ์ฆ๋ "๋ญ๊ฐ ๋ฐ๋์์ผ๋ ๋ค์ ๊ทธ๋ ค์ผ๊ฒ ๋ค"๋ ์ ํธ๋ฅผ ์ ํ ๋ชป ๋ฐ๋๋ค. ๋ฆฌ์ปดํฌ์ง์
์์ฒด๊ฐ ์ผ์ด๋์ง ์์ผ๋ ํ๋ฉด๋ ๋น์ฐํ ์ ๋ฐ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ State๋ก ๋ฐ๊พธ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
kotlin
var isSelected by remember { mutableStateOf(false) }์ฌ๊ธฐ์ ๋ ๊ฐ๊ฐ ํ๋ ์ญํ ์ด ๋ค๋ฅด๋ค.
mutableStateOf(false)๋ ์ด ๊ฐ์ ์ปดํฌ์ฆ๊ฐ ๊ฐ์ํ ์ ์๋ State๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด๋ค. ์ด ๊ฐ์ ์ฝ๋ ์ปดํฌ์ ๋ธ์ด ์์ผ๋ฉด ์ปดํฌ์ฆ๋ ๊ทธ๊ฑธ ๊ธฐ๋กํด๋๊ณ , ๊ฐ์ด ๋ฐ๋๋ฉด ๊ทธ ์ปดํฌ์ ๋ธ์ ๋ค์ ์คํํ๋๋ก ์์ฝํ๋ค.
remember๋ ๋ณ๊ฐ์ ์ญํ ์ด๋ค. ๋ฆฌ์ปดํฌ์ง์
์ด ์ผ์ด๋์ ํจ์๊ฐ ๋ค์ ์คํ๋๋๋ผ๋, ์ด ๊ฐ์ ์ฒ์๋ถํฐ ๋ค์ ๋ง๋ค์ง ์๊ณ ์ด์ ๊ฐ์ ๊ทธ๋๋ก ๋ถ์ก์๋๋ ์ญํ ์ ํ๋ค.
์ remember๊ฐ ๋ฐ๋ก ํ์ํ๋๋ฉด, ๋ฆฌ์ปดํฌ์ง์
์ด ์ผ์ด๋๋ค๋ ๊ฑด ๊ฒฐ๊ตญ ํจ์๊ฐ ์์์๋ถํฐ ๋ค์ ์คํ๋๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ด๋ค. remember ์์ด mutableStateOf(false)๋ง ์ฐ๋ฉด, ํจ์๊ฐ ๋ค์ ์คํ๋ ๋๋ง๋ค ๊ทธ ์ค์ ๋ ๋ง๋์ ๋งค๋ฒ ์๋ก์ด State๋ฅผ false๋ก ๋ค์ ๋ง๋ค์ด๋ฒ๋ฆฐ๋ค. remember๊ฐ "์ด, ์ด๊ฑฐ ์ด๋ฏธ ๋ง๋ ์ ์์์. ์๋ก ๋ง๋ค์ง ๋ง๊ณ ๊ธฐ์กด ๊ฐ ๊ทธ๋๋ก ์จ"๋ผ๊ณ ๋ถ์ก์์ฃผ๋ ๊ฒ์ด๋ค.
์ ๋ฆฌํ๋ฉด:
- ์นด๋ ํด๋ฆญ โ
isSelected = true(State ๊ฐ ๋ณ๊ฒฝ) - ์ปดํฌ์ฆ๊ฐ ์ด State๋ฅผ ์ฝ๊ณ ์๋ ๊ณณ์ ๊ฐ์ง โ ๋ฆฌ์ปดํฌ์ง์ ์์ฝ
GroupCardํจ์๊ฐ ๋ค์ ์คํ๋จremember๋๋ถ์isSelected๋ ์ด๊ธฐํ๋์ง ์๊ณtrue๋ก ์ ์ง๋ ์ฑ ์ฝํ- ๋ฐ๋ ๊ฐ ๊ธฐ์ค์ผ๋ก ํ ๋๋ฆฌ ์์ด ๋ค์ ๊ทธ๋ ค์ง
์ด ๋์ ๊ฐ์ด ์จ์ผ "๊ฐ์ด ๋ฐ๋๋ฉด ๋ค์ ๊ทธ๋ฆฌ๊ณ , ๋ค์ ๊ทธ๋ ค์ ธ๋ ๊ฐ์ ์ ์ง๋๋" ์ํ๊ฐ ์์ฑ๋๋ค.
์ฝ๋๋ฅผ ๊ณ ์ณ๋ณด๋ฉด:
kotlin
@Composable
fun GroupCard(
group: Group,
onClick: () -> Unit
) {
var isSelected by remember { mutableStateOf(false) }
Card(
onClick = {
isSelected = true
onClick()
},
border = if (isSelected) BorderStroke(2.dp, Color.Blue) else null
) {
// ...
}
}์ด์ ๋๋ ์ ๋ ์ค์ ๋ก ํ ๋๋ฆฌ ์์ด ๋ฐ๋๋ค.
๊ทผ๋ฐ ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ ํ๋ ์๋ค.
์ด ์ํ, ์ฑ์ ๊ป๋ค ์ผ๋ฉด ์ฌ๋ผ์ง๋ค. ์ด ํ๋ฉด์ ๋ฒ์ด๋ฌ๋ค๊ฐ ๋ค์ ๋ค์ด์๋ ์ด๊ธฐํ๋ ์ ์๋ค.
์๋๋ฉด remember๋ ๋ฑ "์ด ์ปดํผ์ ๋ธ์ด ํ๋ฉด์ ๋ ์๋ ๋์"๋ง ๊ธฐ์ตํ๋ ๋ฉ๋ชจ๋ฆฌ์์ ์์ ์ ์ฅ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ State๋ "์ง์ง ์ ์ฅ"์ด ์๋๋ผ "ํ๋ฉด์ด ๋ ์๋ ๋์ ์ ๊น ๊ธฐ์ตํ๋ ๊ฒ"์ ๊ฐ๊น๋ค.
์ง์ง๋ก ์ฑ์ ๊ป๋ค ์ผ๋ ์ ์ง๋๊ฒ ํ๋ ค๋ฉด ๋ก์ปฌ DB(Room)๋ DataStore, ์๋๋ฉด ์๋ฒ์ ์ ์ฅํด์ผ ํ๋ค.
๊ทธ๊ฑด ๋ค์ ๊ธ์์ ๋ค๋ค๋ณด๊ฒ ๋ค.
