#1 Jetpack Compose
#1-1 ๊ฐ์
Jetpack Compose UI ์ฑ ๊ฐ๋ฐ ๋๊ตฌ ํคํธ - Android ๊ฐ๋ฐ์ | Android Developers
์ฑ ์์ฑ ์๋๋ฅผ ๋์ด๋ ๋ฐ ๋์์ด ๋๋ Android์ UI ์ฑ ๊ฐ๋ฐ ๋๊ตฌ ํคํธ์ ๋ฆฌ์์ค์ธ Jetpack Compose๋ฅผ ์ดํด๋ณด์ธ์.
developer.android.com
์ ํต์ ์ธ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ธฐ์กด์ ์๋๋ก์ด๋ ํ๋ก์ ํธ์์ UI ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ช ๋ น์ ํ๋ก๊ทธ๋๋ฐ์ด์๋ค. XML ๋ ์ด์์๊ณผ ํด๋น ๋ ์ด์์์ ์ฐธ์กฐํ๋ Java ๋ฐ Kotlin ์ฝ๋๋ก ๋ถ๋ฆฌ๋์ด ์๋ค. ์ด ๋, ์๋กญ๊ฒ ์ถ๋ฒํ Jetpack Compose๋ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก, XML ํ์ผ ์์ด ๋ชจ๋ UI๋ฅผ Kotlin ์ฝ๋๋ก ์์ฑํ๋ค (UI์ ๋ก์ง์ ํตํฉ).
Jetpack Compose๊ฐ ๊ธฐ์กด์ ๋ฐฉ์๊ณผ ๋น๊ตํ์ฌ ์ด์ ์ ๊ฐ๋ ๋ถ๋ถ์ ๋จผ์ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก์ ์ ํ์ ํตํ ๊ฐ๊ฒฐํ ์ฝ๋(๋์ ๊ฐ๋
์ฑ)์ ์์์ ์ผ๋ก ์งํ๋๋ UI์ ์ํ(State) ๊ด๋ฆฌ๋ค. ๋, XML๊ณผ ๋ก์ง์ ํตํฉํจ์ผ๋ก์จ ๋๋์ฑ ๋์์ง ์ฝ๋์ ๊ฐ๋
์ฑ์ด๋ค (์ด ๋ถ๋ถ์ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ์ด์ ์ด ์๋๋ผ ๊ทธ๋ฅ Jetpack Compose ์์ฒด์ ํน์ฑ์ด๋ค).
#1-2 ์ฝ๋ ์์
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Text("Hello world!")
}
}
}
์ด ์ฝ๋๋ ํ๋ฉด์ "Hello wolrd!"๋ฅผ ์ถ๋ ฅํ๋ค. Text()์ฒ๋ผ UI์ ๊ด์ฌํ๋ ํจ์๋ฅผ Composable์ด๋ผ๊ณ ํ๋ฉฐ ํจ์ ์์ @Composable๋ฅผ ๋ถ์ฌ ๊ตฌ๋ถํ๋ค.
#1-3 Composable์ ๊ตฌ์กฐ
@Composable
fun ComposableExample(
modifier: Modifier,
...,
content: @Composable () -> Unit
): Unit
Composable ํจ์์ ๊ตฌ์กฐ๋ ๋๋ถ๋ถ ์์ ๊ฐ๋ค. Modifier ๋ฑ์ ๋งค๊ฐ๋ณ์๋ ComposableExample์ ์์ฑ์ ์ ์ํ๋ ๋ฐ์ ์ฌ์ฉ๋๋ค. ๋งจ ๋ง์ง๋ง์ ์๋ ๋งค๊ฐ๋ณ์์ธ content๋ ComposableExample์ ์์์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. HTML์์์ ์ด๋ค ํ๊ทธ์ textContent, <h2> ํ๊ทธ๋ฅผ ์๋ก ๋ค๋ฉด <h2>Hello!</h2>์ Hello!์ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ค ํํ์์ ๋ฌธ๋ฒ(์ด ๊ธ์ #2-5 ์ฐธ์กฐ)์ ์ํด ๋๋ค ํํ์์ ์๊ดํธ์์ ๋นผ์ด ์ค๋ฅธ์ชฝ์ ๋๋ฉด, ComposableExample( ... ) { ... }์ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ๋๋๋ฐ, ์ด ๊ตฌ์กฐ๊ฐ ์์ผ๋ก Jetpack Compose์์ ๊ฐ์ฅ ๋ง์ด ๋ณด๊ฒ ๋๋ ํ์์ด๋ค.
#2 Jetpack Compose ์ฌ์ฉํ๊ธฐ
#2-1 ๊ฐ์
์๋๋ก์ด๋ ํ๋ก์ ํธ ์์ฑ ์ ์ ํํ ์ ์๋ ๊ธฐ๋ณธ Jetpack Compose ํ ํ๋ฆฟ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ณด๊ณ , ํด๋น ํ ํ๋ฆฟ ์ ์ฝ๋๋ฅผ ์ดํด๋ณธ๋ค.
#2-2 ํ๋ก์ ํธ ๋ง๋ค๊ธฐ
Empty Activity๋ฅผ ์ ํํ๋ค. ํด๋น ํญ๋ชฉ์ Jetpack Compose ์์ด์ฝ๋ ๋ณด์ธ๋ค.
#2-3 MainActivity.kt
ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด ๋ฏ์ ์ฝ๋๋ค์ด ๋ค์ด์๋ MainActivity๊ฐ ๋ฐ๊ฒจ์ค๋ค. ๊ทธ๋ฐ๋ฐ, XML ์ฝ๋์์ ๋ณด๋ [Code / Split / Design] ํญ ์ ํ ๋ฒํผ์ด ๋ณด์ธ๋ค. ์ด๋ MainActivity๊ฐ ๊ทธ ์์ฒด๋ก UI๊น์ง ๊ทธ๋ ค๋ด๊ธฐ ๋๋ฌธ์ด๋ค.
setContent { ... }
Composable UI์ ์์์ ์ผ๋ก, ์ด ์์ญ์ @Composable ํจ์๋ฅผ ๋ฃ์ผ๋ฉด UI๋ฅผ ์กฐ์ํ ์ ์๋ค.
JetpackComposeBasicsTheme( ... ) { ... }
ui.theme ํจํค์ง์ Theme.kt์๋ ์๋๋ก์ด๋ ์คํ๋์ค๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ค์ด๋ ์ด ํ๋ก์ ํธ์ ํ ๋ง(Theme)๊ฐ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก "${ํ๋ก์ ํธ๋ช } + Theme"์ ์กฐํฉ์ผ๋ก ์ด๋ฆ์ด ์ง์ด์ง๋ค. ์ด๊ฑธ ์ฌ์ฉ์ ์ ๋ง์ ๋ง๊ฒ ์์ ํด์ ์ฌ์ฉํ๋ผ๋ ์๋๋ค. ๊ทธ๋ฆฌ๊ณ MainActivity์ ๊ธฐ๋ณธ์ ์ผ๋ก built-in๋ ์ฝ๋์ ์ด Theme๊ฐ ์ฐ์ด๊ณ ์๋ค. Theme๋ Composable์ ๋ํ ์ ์ญ ์ค์ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
Surface( ... ) { ... }
Composable๋ค์ Container๋ค. Surface( A ) { B }์์, A๋ Surface์ ๋ํ ์ค์ ์ด์ง B์ ๋ํ ์ค์ ์ด ์๋์ ์ ์ํ๋ค. B๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ Theme์ ์์ฑ์ ์์๋ฐ์ ์ฌ์ฉํ๋ค. ์ด ํ๋ก์ ํธ์๋ Greeting()์ด ๋ฐ๋ก B์ ํด๋นํ๋๋ฐ, Greeting()์ ๋ํ ์ ์ญ์ ์ค์ ์ด ๋ฐ๋ก Theme์ ๋ชซ์ธ ๊ฒ์ด๋ค. Surface์ ์์ฑ์ ์ด์ด์ง๋ ๊ฒ์๊ธ์์ ์์ธํ ๋ค๋ฃฌ๋ค.
Modifier
UI ์์ฑ์ Setter๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. ์ด์ด์ง๋ ๊ฒ์๊ธ์์ ์์ธํ ๋ค๋ฃฌ๋ค.
#2-4 ์๋ ํ์ธ
์คํ์์ผฐ์ ๋์ ๋ชจ์ต์ด๋ค.
#3 @Preview
#3-1 ๊ฐ์
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
JetpackComposeBasicsTheme {
Greeting("Android")
}
}
#2-3์์ ๋ง๋ค์ด์ง ์ฝ๋ ์ค์๋ ์์ ๊ฐ์ @Preview ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํจ์๋ ์๋ค. ์ด ํจ์๋ ์ผ์ข ์ ํ ์คํธ ์ฝ๋๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. setContent { ... }์ ๋ฃ๊ธฐ ์ํ ํจ์๋ฉฐ, Design ํญ์์ Composable์ ๋ชจ์ต์ ์๋๋ก์ด๋ ์๋ฎฌ๋ ์ดํฐ์ ์คํ ์์ด ๋ฐ๋ก ํ์ธํ๊ธฐ ์ํ ์ฉ๋๋ค.
#3-2 @Preview์ ์ ์ฝ
// Default parameter๊ฐ ์๋ @Composable ํจ์์๋ @Preview๋ฅผ ๋ฌ ์ ์๋ค.
@Preview(showBackground = true)
@Composable
fun GreetingPreviewWithDefaultParameter(name: String = "interfacer_han") {
JetpackComposeBasicsTheme {
Greeting(name)
}
}
// ๋งค๊ฐ๋ณ์์ @PreviewParameter๊ฐ ๋ถ์ @Composable ํจ์์๋ @Preview๋ฅผ ๋ฌ ์ ์๋ค.
@Preview(showBackground = true)
@Composable
fun GreetingPreviewWithProvider(@PreviewParameter(MyParameterProvider::class) name: String) {
JetpackComposeBasicsTheme {
Greeting(name)
}
}
class MyParameterProvider : PreviewParameterProvider<String> {
override val values = sequenceOf("steve", "kevin")
}
Composable์ @Preview ์ด๋ ธํ ์ด์ ์ ๋ค๋ ์๊ฐ Design ํญ์์ ๊ทธ ๋ชจ์ต์ ํ์ธํ ์ ์์ง๋ง, ์ ์ฝ ์ฌํญ์ด ์๋ค. ๋ฐ๋ก ๋งค๊ฐ๋ณ์๊ฐ ์๊ฑฐ๋, ์๋๋ผ๋ ๋งค๊ฐ๋ณ์์ Default๊ฐ์ด ์๊ฑฐ๋ ํน์ @PreviewParameter๊ฐ ์์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ ์ฝ๋๋ ํด๋น ์ ์ฝ ์ฌํญ์ ๊ทน๋ณตํ๋ ์ฝ๋๋ค.
#3-3 Design ํญ์์ ํ์ธํ๊ธฐ
Design ํญ์ ๋๋ฅด๋ฉด Build & Refresh ๋ฒํผ์ด ๋์จ๋ค. ์ด๋ ์ต์ด ์ง์ ์ ์ฐ๋ ํ๋ฉด์ผ๋ก ๊ทธ๋ฅ Build & Refresh ๋ฒํผ์ ๋๋ฅด๊ณ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋๋ค.
์ด๋ ๊ฒ @Preview ์ด๋ ธํ ์ด์ ์ด ๋ถ์ Composable๋ค์ ๋ชจ์ต๋ค์ ์๋๋ก์ด๋ ์๋ฎฌ๋ ์ดํฐ ์คํ ์์ด ํ์ธํ ์ ์๋ค.
#4 ์์ฝ
Jetpack Compose๋ UI์ ๋ก์ง์ ๊ฒฐํฉ์ํจ๋ค.
#5 ์์ฑ๋ ์ฑ
android-practice/jetpack-compose/JetpackComposeBasics at master · Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Jetpack Compose - Modifier (0) | 2024.07.22 |
---|---|
[Android] Jetpack Compose - Surface (0) | 2024.07.22 |
[Android] Dagger2 - Hilt๋ก ๋ง์ด๊ทธ๋ ์ด์ (0) | 2024.07.12 |
[Android] Data Binding - View Binding (1) | 2024.07.10 |
[Android] Unit Testing - Retrofit (0) | 2024.07.08 |