02
23

@Immutable
data class LoginState(
    val id: String = "",
    val password: String = "",
)

์ปดํฌ์ฆˆ๋กœ ๊ฐœ๋ฐœ ์ค‘์ธ๋ฐ, ์ด์ „ UiState์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ ์“ฐ๋Š” data class์— `@Immutable` ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค˜์•ผํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜๋‹ค. ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ๋ ๊นŒ?

 

`@Immutable`์€ ๊ฐ์ฒด๊ฐ€ ๋ถˆ๋ณ€(Immutable)์ž„์„ ๋ช…์‹œํ•˜์—ฌ, ๋‚ด๋ถ€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ผ์ด ์—†๋‹ค๊ณ  Compose์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.  ํ•˜์ง€๋งŒ, @Immutable์ด ๋ถ™์–ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฆฌ์ปดํฌ์ง€์…˜์„ "์ ˆ๋Œ€ ์•ˆ ํ•˜๋Š” ๊ฒƒ"์ด ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์ปดํฌ์ง€์…˜์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

`@Stable`์€ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ, Compose๊ฐ€ ๋‚ด๋ถ€ ํ•„๋“œ ๋ณ€ํ™”๊นŒ์ง€ ์ถ”์  ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
์ฆ‰, @Stable์ด ๋ถ™์–ด ์žˆ๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ฆฌ์ปดํฌ์ง€์…˜์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ, ๊ฐ์ฒด๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์ปดํฌ์ง€์…˜์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ข€ ๋” ์ž์„ธํžˆ ๋ณด๊ฒ ๋‹ค.

@Composable
fun UserProfile(user: User) {
    /* body */ 
}

์ปดํฌ์ €๋ธ”ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ, ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋ฆฌ์ปดํฌ์ง€์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์ด ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋Š” user์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€์•Š๋Š” ํ•œ UserProfile์ด ๋ฆฌ์ปดํฌ์ง€์…˜ ๋˜์ง€์•Š๋Š”๋‹ค.(๋ณด๊ณ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ user ํ•˜๋‚˜๋ผ๊ณ  ํ–ˆ์„ ๋•Œ)

 

@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }

    Button(onClick = { count++ }) {
        Text("Count: $count")
    }
}

์ปดํฌ์ฆˆ์—์„œ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒํƒœ๋ผ๊ณ  ๋ณดํ†ต ์–˜๊ธฐํ•˜๋Š”๋ฐ, `by remember { mutableStateOf(T) }`๋กœ ์„ ์–ธํ•ด์„œ ์ผ์„ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ var ๊ฐ์ฒด๋กœ ์„ ์–ธ๋œ ๊ฑด ์ƒํƒœ๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๊ณ , ๋งŒ์•ฝ ์ด๊ฒŒ count๋ผ๊ณ  ํ–ˆ์„ ๋•Œ count ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด ์ด๊ฑธ ๋ณด๊ณ ์žˆ๋˜ ์ปดํฌ์ €๋ธ”์€ ๋ฆฌ์ปดํฌ์ง€์…˜๋œ๋‹ค.

stateDiagram-v2
 [*] --> ์ƒํƒœ๋ณ€ํ™”: ์ƒํƒœ_๋ณ€๊ฒฝ_๊ฐ์ง€
์ƒํƒœ๋ณ€ํ™” --> ๋ฆฌ์ปดํฌ์ง€์…˜_ํ•„์š”_์—ฌ๋ถ€_ํŒ๋‹จ

๋ฆฌ์ปดํฌ์ง€์…˜_ํ•„์š”_์—ฌ๋ถ€_ํŒ๋‹จ --> ๋ฆฌ์ปดํฌ์ง€์…˜์ด_ํ•„์š”ํ•˜๋ฉด: Yes
๋ฆฌ์ปดํฌ์ง€์…˜_ํ•„์š”_์—ฌ๋ถ€_ํŒ๋‹จ --> ๋ฆฌ์ปดํฌ์ง€์…˜์ด_ํ•„์š”์—†์Œ: No

๋ฆฌ์ปดํฌ์ง€์…˜์ด_ํ•„์š”ํ•˜๋ฉด --> ์žฌ๊ตฌ์„ฑ๋œ_Composable๋“ค: ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€_์„ ํƒ์ ์œผ๋กœ_์žฌ๊ตฌ์„ฑ
๋ฆฌ์ปดํฌ์ง€์…˜์ด_ํ•„์š”์—†์Œ --> [*]

์žฌ๊ตฌ์„ฑ๋œ_Composable๋“ค --> UI_๋‹ค์‹œ_๊ทธ๋ฆผ: ๋‹ค์‹œ_๋ Œ๋”๋งํ•œ๋‹ค

UI_๋‹ค์‹œ_๊ทธ๋ฆผ --> [*]

 

๋ฆฌ์ปดํฌ์ง€์…˜์€ UI ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ์— ๋Œ€ํ•ด์„œ UI๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ํ™”์™€๋„ ๋ฐ€์ ‘ํ•œ ์—ฐ๊ด€์ด ์žˆ๋‹ค. ์ฆ‰ ์•„๋ž˜์ฒ˜๋Ÿผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

  • ์ƒํƒœ ๋ณ€ํ™”๋Š” UI ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉฐ, Compose์—์„œ ์ž๋™ ๊ฐ์ง€
  • ๋ฆฌ์ปดํฌ์ง€์…˜์€ ์‹ค์ œ๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ Composable์„ ์žฌํ˜ธ์ถœํ•˜์—ฌ UI๋ฅผ ๊ฐฑ์‹ 

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT