๐ŸŒ€remember & mutableStateOf

์ด์˜ํ›ˆยท2025๋…„ 4์›” 21์ผ
0

All About Compose

๋ชฉ๋ก ๋ณด๊ธฐ
5/5

Jetpack Compose์˜ remember์™€ mutableStateOf ์™„๋ฒฝ ์ดํ•ดํ•˜๊ธฐ

Jetpack Compose๋Š” ์ƒํƒœ(State)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์„ ์–ธํ˜• UI ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ์—์„œ remember์™€ mutableStateOf๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ๋กœ, Compose์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋‘ ๊ฐœ๋…์ด ๊ฐ๊ฐ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๊ณ , ํ•จ๊ป˜ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


โœ… remember๋ž€?

remember๋Š” Composable ํ•จ์ˆ˜๊ฐ€ ์žฌ๊ตฌ์„ฑ(Recomposition) ๋  ๋•Œ, ์ด์ „ ๊ฐ’์„ ๊ธฐ์–ตํ•ด์„œ ์œ ์ง€ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
Jetpack Compose์—์„œ๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ด€๋ จ Composable ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด remember๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

val count = remember { mutableStateOf(0) }
  • mutableStateOf(0)๋Š” ์ƒํƒœ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • remember { ... }๋Š” ์ด ๊ฐ์ฒด๋ฅผ ์ปดํฌ์ง€์…˜ ์‚ฌ์ด์—์„œ๋„ ์œ ์ง€์‹œํ‚ต๋‹ˆ๋‹ค.

์ฆ‰, ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ ์ปดํฌ์ง€์…˜์ด ๋‹ค์‹œ ์ผ์–ด๋‚  ๋•Œ ๊ฐ’์ด ์œ ์ง€๋˜๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


โœ… mutableStateOf๋ž€?

mutableStateOf๋Š” Compose์—์„œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
ํ•ด๋‹น ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” Composable ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ recomposition(์žฌ์ปดํฌ์ง€์…˜) ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

val count = mutableStateOf(0)
count.value = 1

์ด ๊ฒฝ์šฐ count.value์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” Composable ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ž๋™ ๋ฐ˜์‘ํ˜• ๊ตฌ์กฐ ๋•๋ถ„์— Compose๋Š” ๋งค์šฐ ์„ ์–ธ์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•œ UI ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… ๋‘˜์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

val count = remember { mutableStateOf(0) }

์œ„ ์ฝ”๋“œ๋Š” Compose์—์„œ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

  • mutableStateOf๋Š” ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ ,
  • remember๋Š” ์ด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์žฌ๊ตฌ์„ฑ ์‹œ์—๋„ ์œ ์ง€ํ•ด์ค๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ™”๋ฉด์ด ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋˜๋ฉฐ, ์žฌ์ปดํฌ์ง€์…˜์ด ์ผ์–ด๋‚˜๋„ ์ƒํƒœ๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


โœ… ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

@Composable
fun Counter() {
    val count = remember { mutableStateOf(0) }

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

๋™์ž‘ ํ๋ฆ„

  1. ์ตœ์ดˆ ์ปดํฌ์ง€์…˜ ์‹œ count๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
  2. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด count.value++๋กœ ๊ฐ’์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ด ์ƒํƒœ ๊ฐ’์˜ ๋ณ€ํ™”๋Š” Compose์— ์ž๋™์œผ๋กœ ๊ฐ์ง€๋˜์–ด Text๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.
  4. remember ๋•๋ถ„์— count๋Š” ์ปดํฌ์ง€์…˜์ด ๋‹ค์‹œ ์ผ์–ด๋‚˜๋„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

โ— remember ์—†์ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

val count = mutableStateOf(0)  // remember ์—†์Œ

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ, Composable ํ•จ์ˆ˜๊ฐ€ ์žฌ๊ตฌ์„ฑ๋  ๋•Œ๋งˆ๋‹ค count๊ฐ€ ๋‹ค์‹œ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
์ฆ‰, ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๊ฐ’์€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ํ•ญ์ƒ 0์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”š ๋งˆ๋ฌด๋ฆฌ

  • mutableStateOf๋Š” ์ƒํƒœ๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ทธ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ Compose๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ˜์‘ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • remember๋Š” ์ด ์ƒํƒœ๋ฅผ ์ปดํฌ์ง€์…˜ ๊ฐ„์— ์œ ์ง€์‹œ์ผœ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์€ Compose์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ฉด์„œ๋„ ์ค‘์š”ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
Jetpack Compose๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ ๊ธฐ๋ฐ˜ UI ํ๋ฆ„์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด ์กฐํ•ฉ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๊ผญ ์ˆ™์ง€ํ•˜์‹œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๋” ๊นŠ์€ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” rememberSaveable, ViewModel, StateFlow ๋“ฑ๊ณผ ํ•จ๊ป˜ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ๊ฒŒ์‹œ๊ธ€์—์„œ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

profile
์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹น

0๊ฐœ์˜ ๋Œ“๊ธ€