๐Ÿ’š[Android]๊ณต์‹ ๋ฌธ์„œ๋กœ ์‚ดํŽด๋ณด๋Š” Jetpack Compose๋ฅผ ํ•ด์•ผํ•˜๋Š” ์ด์œ 

yeonjeenยท2024๋…„ 4์›” 18์ผ
2

Android

๋ชฉ๋ก ๋ณด๊ธฐ
3/10
post-thumbnail

Jetpack Compose ๊ณต์‹๋ฌธ์„œ
[์•„๋ž˜ ๋‚ด์šฉ์€ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.]


SOPT 34๊ธฐ ์•ˆ๋“œ๋กœ์ด๋“œ ํŒŒํŠธ ๋ฉด์ ‘ ์ค‘ "compose๋ฅผ ์ ์šฉํ•˜๊ณ  ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ญ”๊ฐ€์š”?"๋ผ๋Š” ์งˆ๋ฌธ์„ ๋ฐ›์•˜์—ˆ๋‹ค.

๊ทธ๋•Œ๋Š” ์ปดํฌ์ฆˆ๋ฅผ ์ ‘ํ•˜๊ธฐ ์ „์ด์—ˆ๊ณ , 'compose ๊ณต๋ถ€๋ฅผ ํ•ด์•ผํ•œ๋‹ค'๋ผ๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๊ต‰์žฅํžˆ ๋งŽ์ด ๋“ค์—ˆ๋˜ ์‹œ๊ธฐ๋ผ ๋‹น์—ฐํžˆ ๊ณต๋ถ€ํ•ด์•ผํ•˜๋Š” ์กด์žฌ๋ผ๊ณ ๋งŒ ์—ฌ๊ฒผ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ compose๋ฅผ ๋‹น์—ฐํžˆ ํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งŽ์€ ์ด๋“ค์ด ๋งํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?


1๏ธโƒฃ Less code(์ ์€์ฝ”๋“œ)

์ ์€ ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ/๋””๋ฒ„๊ทธ ์ž‘์—…์ด ์ ๊ณ  ๋ฒ„๊ทธ ๋ฐœ์ƒ๊ฐ€๋Šฅ์„ฑ๋„ ์ค„์–ด๋“ ๋‹ค.
๋˜ํ•œ ์ฝ”๋“œ๊ฐ€ ์ ๋‹ค๋Š” ๊ฑด ๊ทธ๋งŒํผ ์œ ์ง€๋ณด์ˆ˜ ํ•ด์•ผํ•˜๋Š” ์ฝ”๋“œ๋„ ์ค„์–ด๋“ ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ด๋‹ค.
Compose

@Composable
fun Greeting() {
    Column {
        Text(text = "Hello, Compose!", color = Color.Black, fontSize = 20.sp)
    }
}

xml

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello, XML!"
    android:textSize="20sp"
    android:textColor="@android:color/black"
    android:layout_gravity="center"/>

2๏ธโƒฃ Intuitive(์ง๊ด€์ )

1) ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ


๊ธฐ์กด xml ๋ฐฉ์‹์€ view์™€ data ์‚ฌ์ด์— ์ค‘๊ฐ„ ๊ณ„์ธต์„ ํ•„์š”๋กœํ•œ๋‹ค.
๊ทธ๋ž˜์„œ xml์„ ์ˆ˜์ •ํ•˜๋ฉด ์ฝ”ํ‹€๋ฆฐ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ์ˆ˜์ •์„ ํ•˜๋Š” ๋“ฑ xml๊ณผ ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ๋ฅผ ๊ฐ™์ด ๋ด์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ compose์˜ ๊ฒฝ์šฐ ์ฝ”ํ‹€๋ฆฐ ํ•จ์ˆ˜๋กœ UI๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ง๊ด€์ ์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋˜ํ•œ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ๋„ ์ด๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค.

2) ์ƒํƒœ๊ฐ€ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ

<Button
    android:id="@+id/myButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click me!"
    android:background="@color/blue"
    android:textColor="@android:color/white"
    android:layout_centerInParent="true"/>
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myButton = findViewById<Button>(R.id.myButton)
        myButton.setOnClickListener {
            Toast.makeText(this, "Button clicked!", Toast.LENGTH_SHORT).show()
        }
    }
}

์œ„ ์ฝ”๋“œ๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ์˜ onCreate ๋ฉ”์„œ๋“œ์—์„œ XML ํŒŒ์ผ์—์„œ ์ •์˜๋œ ๋ฒ„ํŠผ์„ ์ฐพ์•„ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ๋Š” ๋ฒ„ํŠผ์€ ํ•ด๋‹น ์•กํ‹ฐ๋น„ํ‹ฐ์— ์ข…์†๋˜์–ด์žˆ๋‹ค.

@Composable
fun MyButton(text: String, onClick: () -> Unit) {
    Button(
        onClick = onClick,
        colors = ButtonDefaults.buttonColors(backgroundColor = Color.Blue)
    ) {
        Text(text = text, color = Color.White)
    }
}

์œ„์˜ ์ฝ”๋“œ์—์„œ MyButton ํ•จ์ˆ˜๋Š” ์ƒํƒœ ์—†๋Š” ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•œ๋‹ค.

์ด ๋ฒ„ํŠผ์€ ํ…์ŠคํŠธ์™€ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ , ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ „๋‹ฌ๋œ ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ •์˜๋œ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋Š” ํŠน์ •ํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ์— ์ข…์†๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ํ™”๋ฉด์—์„œ ์‰ฝ๊ฒŒ ์žฌ์‚ฌ์šฉO

3๏ธโƒฃ Accelerate development(๋น ๋ฅธ๊ฐœ๋ฐœ)


Compose๋Š” ๊ธฐ์กด์˜ ๋ชจ๋“  ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋œ๋‹ค.

Compose์—์„œ Views๋ฅผ, Views์—์„œ Compose ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœ โญ•๏ธ

Navigation, ViewModel, Kotlin ์ฝ”๋ฃจํ‹ด๊ณผ ๊ฐ™์€ ๋Œ€๋ถ€๋ถ„์˜ ์ผ๋ฐ˜์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Compose์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์–ธ์ œ ์–ด๋””์„œ๋“  ์›ํ•˜๋Š” ๋Œ€๋กœ ์ฑ„ํƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

4๏ธโƒฃ Powerful(๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ)

  • Compose๋Š” Android ํ”Œ๋žซํผ API์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๊ณ  ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ, ์–ด๋‘์šด ํ…Œ๋งˆ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›
  • ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ์œผ๋กœ ๋นŒ๋“œํ•˜๋“  ์ž์ฒด ๋””์ž์ธ ์‹œ์Šคํ…œ์œผ๋กœ ๋นŒ๋“œํ•˜๋“ , Compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ๋””์ž์ธ์„ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„

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