[260114] Android Jetpack Compose์˜ 3๋‹จ๊ณ„ ์‹คํ–‰ ํŒŒ์ดํ”„๋ผ์ธ(์ปดํฌ์ง€์…˜, ๋ ˆ์ด์•„์›ƒ, ๊ทธ๋ฆฌ๊ธฐ)

2026. 1. 14. 15:50ยทํ”„๋กœ๊ทธ๋ž˜๋ฐ/Android
์ปดํฌ์ง€์…˜(Composition), ๋ ˆ์ด์•„์›ƒ(Layout), ๊ทธ๋ฆฌ๊ธฐ(Drawing)

  • Jetpack Compose ๋Š” ์„ ์–ธํ˜• UI ์ฝ”๋“œ๋ฅผ ํ™”๋ฉด์˜ ํ”ฝ์…€(๋ Œ๋”๋ง๋œ UI) ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์œ„ 3๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค. 
  • ์ƒํƒœ ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์…‹ ์ค‘ ๊ผญ ํ•„์š”ํ•œ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. 
  • ex. drawing ์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ณ€๊ฒฝ์€ composition ๊ณผ layout ์„ ์™„์ „ํžˆ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Œ. 
  • ๋ฐ˜๋ฉด ui ๊ตฌ์กฐ ์ž์ฒด๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ์—๋Š” ์„ธ ๋‹จ๊ณ„๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ. 
  • ๊ฐ ๋‹จ๊ณ„๋Š” ์ด์ „ ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์„ธ ๋‹จ๊ณ„๋ฅผ ๋‹ค ๊ฑฐ์น˜๋Š” ๊ฒƒ์€ ์•„๋‹˜. 

 


 1. ์ปดํฌ์ง€์…˜ (Composition) 

  • ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, UI ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ๋ฌด์—‡์„ ํ‘œ์‹œํ•ด์•ผํ• ์ง€๋ฅผ ๊ธฐ๋กํ•จ. 
  • @Composable ํ•จ์ˆ˜๋“ค์ด ์‹คํ–‰ ๋จ. 
  • ๋‹จ์ˆœํžˆ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋„˜์–ด, SlotTable ์ด๋ผ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ด์ „๊ณผ ๋น„๊ต(Diffing) ํ•˜๋Š” ๊ณผ์ •
์ปดํฌ์ €๋ธ”(Composable) ํ•จ์ˆ˜ : UI ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ @Composable ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์œผ๋ฉฐ UI ๋ฅผ ์„ ์–ธํ•จ
์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ ๊ธฐ์ค€ ๋ฐ ํŠน์ง•
1) UI ์š”์†Œ (์˜ˆ: Text, button, cloumn, row ๋“ฑ) 
2) ๋‹ค๋ฅธ ์ปดํฌ์ €๋ธ”์„ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜์— ๋ถ™์—ฌ์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ์š”์†Œ 
3) ํ™”๋ฉด์— ๋ฌด์–ธ๊ฐ€๋ฅผ "๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ์ •๋ณด" ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด @Composable ์„ ๋ถ™์—ฌ์•ผ ํ•จ. 
4) ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํ•จ์ˆ˜๋“ค์€ ์ปดํฌ์ง€์…˜ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰๋˜์–ด UI ํŠธ๋ฆฌ(๋…ธ๋“œ) ๋ฅผ ๊ตฌ์ถ•ํ•จ. 
5) ์ƒํƒœ(state) ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋‹ค์‹œ ์‹คํ–‰(restart) ๋˜์–ด์„œ UI ๊ฐฑ์‹ (์žฌ์ปดํฌ์ง€์…˜) ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, @Composable ๋ถ™์–ด์•ผ ํ•จ. 

 

  • ๋‚ด ํ”„๋กœ์ ํŠธ ์˜ˆ์‹œ(feat. ๋กœ๊ทธ์ธ ๋žœ๋”ฉ ํ™”๋ฉด) 

  • ์œ„ ๋‚˜์—ด๋œ ๊ธฐ์ค€์„ ๋ณด๋ฉด์„œ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด์•˜๋‹ค 
  • ์žฅ๊ธฐ์ ์œผ๋กœ ๋ดค์„๋•Œ ๋น„ํšจ์œจ์ ์ธ ๋ถ€๋ถ„์ด ๋งŽ์•˜๋‹ค
  • ํ˜„์žฌ ์ฝ”๋“œ : ๋กœ๊ทธ์ธ ๋žœ๋”ฉ ํ™”๋ฉด์—์„œ @Composable ์„ ์–ธ๋œ ๋ถ€๋ถ„์€ ์•„๋ž˜์™€ ๊ฐ™์Œ. 
// 1. ์ „์ฒด ํ™”๋ฉด ์ž์ฒด (screen level) 
@Composable
fun LoginLandingScreen( // ์ด๋ฒคํŠธ ํ˜ธ์ด์ŠคํŒ…(Event Hoisting), ํ•จ
    onKakaoLogin: () -> Unit,
    onGoogleLogin: () -> Unit,
    onEmailStart: () -> Unit,
    onHomeClick: () -> Unit,      // ์ž„์‹œ ํ™ˆ๋ฒ„ํŠผ
    onDashboardClick: () -> Unit  // ์ž„์‹œ ๋Œ€์‹œ๋ณด๋“œ ๋ฒ„ํŠผ
) {
Column(modifier = Modifier.fillMaxSize().background(Color.White)) {
        // ์ƒ๋‹จ/ํ•˜๋‹จ ๋ ˆ์ด์•„์›ƒ ๋ฐฐ์น˜ ๋กœ์ง...
        SocialLoginButton(text = "๋˜๋Š” ์ด๋ฉ”์ผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ", onClick = onEmailStart)
        // ...
    }
}

// 2. ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ (component level - ์‚ฌ์šฉ์„ฑ) 
@Composable
fun SocialLoginButton(
    text: String,
    onClick: () -> Unit
) {
    Button(
        onClick = onClick,
        modifier = Modifier
            .fillMaxWidth()
            .height(56.dp), // ํ”ผ๊ทธ๋งˆ์˜ ๋„ํ†ฐํ•œ ๋ฒ„ํŠผ ๋†’์ด
        shape = RoundedCornerShape(28.dp), // ์•„์ฃผ ๋‘ฅ๊ทผ ์•Œ์•ฝ ๋ชจ์–‘
        colors = ButtonDefaults.buttonColors(
            containerColor = Color.White,
            contentColor = Color.Black
        ),
        elevation = ButtonDefaults.buttonElevation(defaultElevation = 0.dp)
    ) 
    
    
// 3. ํ”„๋ฆฌ๋ทฐ (๊ฐœ๋ฐœ ๋„๊ตฌ) 
@Preview(showBackground = true, showSystemUi = true)
@Composable
fun LoginLandingScreenPreview() {
    AuriTheme() {
        LoginLandingScreen(
            onKakaoLogin = {},
            onGoogleLogin = {},
            onEmailStart = {},
            onHomeClick = {}, // ์ž„์‹œ ํ™ˆ๋ฒ„ํŠผ
            onDashboardClick = {}) // ์ž„์‹œ ๋Œ€์‹œ๋ณด๋“œ ๋ฒ„ํŠผ
    }
}
  • ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ํผ์งํ•œ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์ ธ์žˆ๋‹ค. ์• ์ดˆ์— ๊ธฐ๋Šฅ์ด ๋ฒ„ํŠผ ๋ช‡๊ฐœ๋ฟ์ธ ํ™”๋ฉด์ด๋ผ .... 
  • ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ(๊ณตํ†ต) ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ, ์ตœ์†Œํ•œ์˜ ์žฌ์ปดํฌ์ง€์…˜์„ ๋‹ค๋ฐฉ๋ฉด์œผ๋กœ ๊ณ ๋ คํ•˜์—ฌ @Composable ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.    
    • ์žฌ์‚ฌ์šฉ์„ฑ : ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ์“ฐ์ด๋Š” ๋ฒ„ํŠผ, ํ…์ŠคํŠธ ์Šคํƒ€์ผ ๋“ฑ 
    • ์„ฑ๋Šฅ ์ตœ์ ํ™” : ํ™”๋ฉด ์ „์ฒด๊ฐ€ ์žฌ์ปดํฌ์ง€์…˜ ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„๋งŒ ๋ณ„๋„์˜ @Composable ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค๊ณ  ํ•จ. 
  • ์‚ฌ์‹ค์€ ์œ„๋ณด๋‹ค ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ปดํฌ์ €๋ธ” ๋‹จ์œ„๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

๊ฐœ์„ ํ• ๋งŒํ•œ ๋ถ€๋ถ„ 

1. ๋ฒ„ํŠผ 

  • ํ˜„์žฌ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์˜ ๊ฒฝ์šฐ, ๋†’์ด 56.dp, pill ๋ชจ์–‘ 28.dp ๋ผ๋Š” ๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ ์ œ์•ฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ๋งŒ์•ฝ ๋‚˜์ค‘์— ๋ฒ„ํŠผ ๋†’์ด๋ฅผ ์กฐ์ •ํ•˜๊ฒŒ ๋์„๋•Œ ์„ธ ๊ตฐ๋ฐ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋ ˆ์ด์•„์›ƒ ๋‹จ๊ณ„ ์œ ์ง€๋ณด์ˆ˜ ํšจ์œจ์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค. 
  • ๋ฒ„ํŠผ ๊ฐœ์„  ๋ฐฉ์•ˆ: Auri base button ์ด๋ผ๋Š” ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  "๊ทธ๋ฆฌ๊ธฐ(drawing)" ์š”์†Œ(๋กœ๊ณ , ๋ฐฐ๊ฒฝ์ƒ‰, ํ…์ŠคํŠธ) ๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ฒŒํ•œ๋‹ค. 
  • ํ˜„์žฌ ๊ณตํ†ต ui component ๊ฒฝ๋กœ : ui/core/componenets 

2. ์Šคํฌ๋ฆฐ ๋ผˆ๋Œ€ ๊ตฌ์กฐ 

  • ๋˜ํ•œ ํ˜„์žฌ LoginLandingScreen ์ด๋ผ๋Š” ๊ฑฐ๋Œ€ํ•œ ํ•จ์ˆ˜ ์•ˆ์— ๋ชจ๋“  ๋ฒ„ํŠผ์ด ๋“ค์–ด์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์™œ ์ด๋ ‡๊ฒŒ ์งฐ์ง€? 
  • ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ผ: ๋งŒ์•ฝ ๋ฒ„ํŠผ ํ•˜๋‚˜์— "๋กœ๊ทธ์ธ ์ค‘" ์ด๋ผ๋Š” ๋กœ๋”ฉ ์ƒํƒœ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์„œ text ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด, ๋ถ€๋ชจ์ธ LoginLandingScreen ์ „์ฒด๊ฐ€ ์žฌ์ปดํฌ์ง€์…˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. 
  • ์Šคํฌ๋ฆฐ ๊ฐœ์„  ๋ฐฉ์•ˆ: ๊ฐ ๋ฒ„ํŠผ์„ ๋ณ„๋„์˜ @Composable ํ•จ์ˆ˜๋กœ ์™„์ „ํžˆ ๋…๋ฆฝ ์‹œํ‚ค๋ฉด, Composer ๋Š” slot table ์„ ํ™•์ธํ•˜์—ฌ ์ž…๋ ฅ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋ฒ„ํŠผ๋“ค์€ skipToGroupEnd() ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋‹ค. 

 


2. ๋ ˆ์ด์•„์›ƒ (Layout) 

  • ์ƒ์„ฑ๋œ ํŠธ๋ฆฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ ์š”์†Œ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•จ. 
  • ์ปดํฌ์ง€์…˜์—์„œ ์ƒ์„ฑ๋œ ํŠธ๋ฆฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ๊ฐ ๋…ธ๋“œ์˜ ํฌ๊ธฐ(measure)๋ฅผ ์ธก์ •ํ•˜๊ณ  ํ™”๋ฉด ์ƒ์˜ ์ขŒํ‘œ(place)๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •. 
  • ์ฆ‰, ui ์š”์†Œ๋ฅผ ์–ด๋””์—, ์–ผ๋งˆ๋‚˜ ํฌ๊ฒŒ ๊ทธ๋ฆด์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. 
  • ์ œ์•ฝ ์กฐ๊ฑด(Constraints) 
    • ๋ถ€๋ชจ column ์ด ์ž์‹ ๋ฒ„ํŠผ์—๊ฒŒ ์ œ์•ฝ์„ ๊ฑธ ์ˆ˜ ์žˆ์Œ
      • ์˜ˆ: ๊ฐ€๋กœ, ์„ธ๋กœ ์ตœ๋Œ€์ตœ์†Œ ๊ธธ์ด 
      • ๊ฐ€์ค‘์น˜ ๊ณ„์‚ฐ 
      • ๊ฐ„๊ฒฉ ๋ฐฐ์น˜ 
    • ๊ธฐ์กด Android View ์™€์˜ ์ฐจ์ด์  Single Pass Measurement (๋‹จ ํ•œ๋ฒˆ์˜ ์ธก์ •) 
      • Jetpack Compose์˜ ๋ ˆ์ด์•„์›ƒ์€ ๋‹จ ํ•œ ๋ฒˆ์˜ ์ธก์ •(Single Pass)๋งŒ์œผ๋กœ ๋ชจ๋“  ์š”์†Œ์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Œ. 
      • ๊ธฐ์กด ์•ˆ๋“œ๋กœ์ด๋“œ view ์‹œ์Šคํ…œ์ด ๋ณต์žกํ•œ ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ, ํ•œ ํ”„๋ ˆ์ž„ ์•ˆ์—์„œ๋„ on measure ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผ์ผฐ์—ˆ์œผ๋‚˜ "๋‹จ๋ฐฉํ–ฅ ์ œ์•ฝ ์กฐ๊ฑด ์ „๋‹ฌ(Constraints flow down, Sizes return up)" ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•จ
        • (์ž์‹ component ์ธก์ •, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ† ๋Œ€๋กœ ๋ถ€๋ชจ ์ธก์ •, ์ž์‹์—๊ฒŒ ์ตœ์ข… ํฌ๊ธฐ ํ†ต๋ณด ๋“ฑ๋“ฑ ... )
        • ์ด ๊ทœ์น™ ๋•๋ถ„์— UI ๊ฐ€ ์•„๋ฌด๋ฆฌ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋˜์–ด๋„ ์„ฑ๋Šฅ์ด ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋จ. 
      • Modifier ํ•„ํ„ฐ 
        • ๋‹จ์ˆœํžˆ ์†์„ฑ์„ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์˜จ ์ œ์•ฝ ์กฐ๊ฑด(constraints) ์„ ์ž์‹์—๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์ „ ์ˆ˜์ •ํ•˜๋Š” ํ•„ํ„ฐ ์—ญํ• ์„ ํ•จ. 
        • ๊ทธ๋ ‡๋‹ค๋ฉด ์ตœ์ƒ์œ„ column์— ์œ„์น˜ํ•œ modifier ์˜ "๋ถ€๋ชจ"๋Š”? 
          • ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ์Šคํ…œ ์ฐฝ 
          • ์ œ์•ฝ ์กฐ๊ฑด ์˜ˆ์‹œ : "๋„ˆ๋Š” ๊ฐ€๋กœ 0~1080px, ์„ธ๋กœ 0~2400px(ํฐ ํ•ด์ƒ๋„) ์‚ฌ์ด์—์„œ ๋„ค ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•ด"
    Column(
        // ์ „์ฒด ํ™”๋ฉด
        modifier = Modifier
            .fillMaxSize()
            .background(Color.White),

 


3. ๊ทธ๋ฆฌ๊ธฐ (drawing) 

  • ์œ„์น˜๊ฐ€ ์ •ํ•ด์ง„ ์š”์†Œ๋“ค์„ ์‹ค์ œ ํ™”๋ฉด์˜ ํ”ฝ์…€๋กœ ๋ Œ๋”๋งํ•จ. 
  • ์ฆ‰, ์‹ค์ œ ํ™”๋ฉด์— ์ƒ‰์„ ์น ํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๋‹จ๊ณ„ 
  • ex. ๋ถˆํˆฌ๋ช…๋„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„์‹œ, ํˆฌ๋ช…๋„๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค 3๋‹จ๊ณ„๋ฅผ ์ „๋ถ€ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ทธ๋ž˜ํ”ฝ ๋ ˆ์ด์–ด(GraphicsLayer) ๋ฅผ ํ†ตํ•ด ๊ทธ๋ฆฌ๊ธฐ ๋‹จ๊ณ„๋งŒ ํŠธ๋ฆฌ๊ฑฐํ•จ. ์™œ๋ƒํ•˜๋ฉด ๋ถˆํˆฌ๋ช…๋„๊ฐ€ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ or ์œ„์น˜์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ 
  • ๊ทธ๋ž˜ํ”ฝ ๋ ˆ์ด์–ด (GraphicsLayer) 
    • ๊ฐœ๋… : ํ™”๋ฉด์˜ ํŠน์ • ์š”์†Œ๋ฅผ ๋ณ„๋„์˜ ๋ ˆ์ด์–ด์— ๊ทธ๋ ค๋‘๋Š” ๊ฒƒ 
    • ๋‚ด ํ”„๋กœ์ ํŠธ ์ ์šฉ ์˜ˆ์‹œ : ์ฑ—๋ด‡์˜ ์Œ์„ฑ ์ธ์‹ ์•„์ด์ฝ˜์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๊นœ๋นก์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋„ฃ๊ณ ์ž ํ• ๋•Œ 
      • ์ผ๋ฐ˜ ๋ฐฉ์‹ : ๋งค๋ฒˆ ์ปดํฌ์ง€์…˜ ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•จ = ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ ๋ฐœ์—ด ๋ฐœ์ƒ 
      • GraphicsLayer ๋ฐฉ์‹ : Modifier.graphicsLayer { alpha = ... }๋ฅผ ์‚ฌ์šฉ = ์ด๋ฏธ ๊ทธ๋ ค์ง„ ํˆฌ๋ช…๋„ ์กฐ์ ˆ๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ ˆ์ด์•„์›ƒ๊ณผ ์ปดํฌ์ง€์…˜์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  gpu ๊ฐ€ ๊ทธ๋ฆฌ๊ธฐ ๋‹จ๊ณ„๋งŒ ๋‹ด๋‹นํ•  ์ˆ˜ ์žˆ์Œ. 
      • ํ˜„์žฌ ์Œ์„ฑ ์ฑ—๋ด‡ ํ”„๋กœ์ ํŠธ์—์„œ ์ ์šฉํ• ๋งŒํ•œ ๋ถ€๋ถ„ : ์Œ์„ฑ ์ธ์‹ ์‹œ๊ฐํ™” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋„์ž… ์‹œ, graphicsLayer์˜ scale๊ณผ alpha๋ฅผ ์กฐ์ ˆํ•˜์—ฌ ์ผ๋ ์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋ถ€๋“œ๋Ÿฌ์šด ์›€์ง์ž„์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

- ๊ฐœ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ๊ธฐ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

- ์ž˜๋ชป๋œ ์ •๋ณด์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค 

'ํ”„๋กœ๊ทธ๋ž˜๋ฐ > Android' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[kotlin] sealed class (enum class ์™€์˜ ์ฐจ์ด์ )  (0) 2026.01.17
[kotlin] ์ฝ”ํ‹€๋ฆฐ(Kotlin) ๊ณผ ์ฝ”๋ฃจํ‹ด(Coroutine)์— ๋Œ€ํ•ด  (1) 2026.01.17
[260112] Android Context ๋ž€?  (0) 2026.01.12
[240808][์•ˆ๋“œ๋กœ์ด๋“œ ์ž๋ฐ”] ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ๋ฐ ์‹คํ–‰ ๊ณผ์ •  (0) 2024.08.08
[Android/JAVA] "์˜์‹ฌ์Šค๋Ÿฌ์šด ๋“ค์—ฌ์“ฐ๊ธฐ" ์ด์Šˆ . . . Suspicious indentation ์˜ค๋ฅ˜. ์ž‘๋™์—๋Š” ๋ฌธ์ œ ์—†์Œ  (2) 2024.02.09
'ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Android' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [kotlin] sealed class (enum class ์™€์˜ ์ฐจ์ด์ )
  • [kotlin] ์ฝ”ํ‹€๋ฆฐ(Kotlin) ๊ณผ ์ฝ”๋ฃจํ‹ด(Coroutine)์— ๋Œ€ํ•ด
  • [260112] Android Context ๋ž€?
  • [240808][์•ˆ๋“œ๋กœ์ด๋“œ ์ž๋ฐ”] ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ๋ฐ ์‹คํ–‰ ๊ณผ์ •
jennnnna
jennnnna
  • jennnnna
    ๐Ÿ’ป๐Ÿ€Jennna's BLOG
    jennnnna
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (74) N
      • ์ปดํ“จํ„ฐ (1)
        • Operating system ์šด์˜์ฒด์ œ (8)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ (5)
        • JAVA (6)
        • PHP (1)
        • Android (7)
        • Apache (1)
        • Python (0)
      • ๊ณต๋ถ€ (15)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ ๊ณต๋ถ€๊ธฐ๋ก (12)
        • TIL (3)
      • AI (2) N
      • TTS (1)
      • LLM (2)
      • RAG (1)
      • ์–ดํ•™ (5)
        • English (5)
        • Japanese (ๆ—ฅๆœฌ่ชž) (0)
      • ๊ธ€์“ฐ๊ธฐ (5)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ž๋ฐ”๊ณต๋ถ€
    ์ •์ฒ˜๊ธฐ
    cs๊ณต๋ถ€
    ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐœ๋ฐœ
    ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ
    ๋ฌต์€์ง€์ฐธ์น˜๊น€๋ฐฅ
    ์ž๋ฐ”๊ธฐ์ดˆ
    ์žฅ์ธํ•œ๊ณผ
    ๋น„์ „๊ณต์ž๊ฐœ๋ฐœ์ž
    ์ž๋ฐ”๊ณต์‹๋ฌธ์„œ
    ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌํ•„๊ธฐ
    ์ž๋ฐ”๋…ํ•™
    ์šด์˜์ฒด์ œ
    ์•ˆ๋“œ๋กœ์ด๋“œ
    ์นดํŽ˜์•Œ๋ฐ”
    ๋น„์ „๊ณต์žcs๊ณต๋ถ€
    CS์ง€์‹
    ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
    ์˜ค๋ธ”์™„
    ์šด์˜์ฒด์ œ๊ณต๋ถ€
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
jennnnna
[260114] Android Jetpack Compose์˜ 3๋‹จ๊ณ„ ์‹คํ–‰ ํŒŒ์ดํ”„๋ผ์ธ(์ปดํฌ์ง€์…˜, ๋ ˆ์ด์•„์›ƒ, ๊ทธ๋ฆฌ๊ธฐ)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”