Jetpack Compose ๊ฒ์๊ธ ์๋ฆฌ์ฆ
- ๊ธฐ์ด
- Surface
- Modifier
- Layout, Arrangement, Alignment
- Button
- Lazy Column
- State ๊ธฐ์ด
- State Remembering
- State Hoisting
- ViewModel์์ State ์ฌ์ฉํ๊ธฐ
- StateFlow์ SharedFlow
- Scaffold
- Side-effects
- ๊ฐ์ฒด ์งํฅ์ UI ๋ ์ด์ด ์ค๊ณ
- Navigation ๊ธฐ์ด
- Navigation์ Destination ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ (NavBackStackEntry.arguments)
#1 Modifier
#1-1 ๊ฐ์
Modifier | Android Developers
androidx.compose.desktop.ui.tooling.preview
developer.android.com
Jetpack Compose๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ ํต์ ์ธ ๋ฐฉ์์ ์๋๋ก์ด๋ ํ๋ก์ ํธ์์ ์ฐ๋ฆฌ๋ XML ์์ฑ๊ณผ ๊ฐ์ ์ฌ์ฉํ์ฌ ํ ์คํธ์ ๋๋น, ๋์ด, ํ์ํ ํ ์คํธ, ํฌ๊ธฐ, ์คํ์ผ ๋ฐ ์์, ๋ฐฐ๊ฒฝ ์์ ๋ฐ ํจ๋ฉ์ ์ง์ ํ๋ค. ์ด์ ๊ฐ์ UI ๊พธ๋ฐ ์์๋ฅผ Jetpack Compose์์๋ Modifier๋ผ๋ ํด๋์ค๊ฐ ๋ด๋นํ๋ค. Composable ํจ์๋ค์ ๋งค๊ฐ๋ณ์๋ก modifier: Modifier = Modifier๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด Modifier๋ฅผ ํจ์ ์ธ๋ถ์์ ์ธ์๋ก์ ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก UI๋ฅผ ๊พธ๋ฏผ๋ค.
๋, ๊ธฐ์กด XML์์ ์์ ฏ์ ์์ฑ์ ์ค์ ํ๋ ํ์๊ฐ ๊ผญ UI ๊พธ๋ฐ์ด๋ผ๋ ์๊ฐ์ ์ค์ ์ ํ์ ๋๋ ๊ฒ์ ์๋์๋ค. ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ๋ ์คํฌ๋กค ๊ฐ๋ฅ ๋ฑ์ ๋์๋ ํฌ๊ดํ์๋ค. Modifier๋ ๋ง์ฐฌ๊ฐ์ง๋ก UI ์์ ฏ์ ์ด๋ค ๋์๊น์ง๋ ์ค์ ํด์ค ์ ์๋ค.
#1-2 ๋ฉ์๋ ์ฒด์ด๋์ ํตํ ๊ตฌํ
val myModifier1 = Modifier
.background(color = Color.Gray) // ๋ฐฐ๊ฒฝ์์ ํ์์ผ๋ก
.border(10.dp, color = Color.Magenta) // 10dp ๋๊ป์ Magenta ์์ ๊ฐ์ง border ์ค์
.padding(10.dp) // 10dp๋งํผ padding ์ค์
Modifier๋ ์์ ๊ฐ์ด ๋ฉ์๋ ์ฒด์ด๋์ ํตํด ๊ตฌํ๋๋ค. ์ด ๋ง์, ๋ฉ์๋ ์ฒด์ด๋์ ์์๊ฐ ๋งค์ฐ ์ค์ํด์ง๋ค๋ ์๋ฏธ๊ฐ ๋๋ค.
#1-3 ๋ฉ์๋ ์ฒด์ด๋ '์์'์ ์ค์ํจ
val myModifier2 = Modifier
.wrapContentSize()
.background(color = Color(0xFFFFC896))
.border(10.dp, color = Color.White)
.padding(10.dp)
val myModifier3 = Modifier
.background(color = Color(0xFFFFC896))
.border(10.dp, color = Color.White)
.padding(10.dp)
.wrapContentSize() // ์ ๋จนํ. ์ด๋ฏธ fillMaxSize()์ ์ฌ์ฉํ๋ background(), border(), padding()์ด ๋ฉ์๋ ์ฒด์ด๋๋ ํ์ด๊ธฐ ๋๋ฌธ.
UI์ ์ฃผ์ํ ๊พธ๋ฐ ์์ ์ค ํ๋๋ ํด๋น UI ์์ ฏ์ ํฌ๊ธฐ ์ค์ ์ผ ๊ฒ์ด๋ค. Modifier์ ํฌ๊ธฐ ๊ธฐ๋ณธ๊ฐ์ fillMaxSize()๋ก ์ค์ ๋์ด์๋ค. ์ฆ, wrapContentSize() ๋ฑ์ผ๋ก ํฌ๊ธฐ๋ฅผ ๋ช ์ํด์ฃผ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ธ fillMaxSize()๊ฐ ์ ์ฉ๋๋ค. ์ด ๋, ์์ ์ฝ๋๋ฅผ ๋ณด์. myModifier2์ myModifier3๋ ๊ฐ์ Modifier์ผ๊น? ์๋๋ค. ์์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
myModifier2๋ ๋ฉ์๋ ์ฒด์ด๋์ ์ฒซ๋ฒ์งธ ์์๋ก wrapContentSize()์ ์ฌ์ฉํ๋ค. ์ด ์ ์ ์ ์ธ ์ฌ์ฉ์ ์ํด์ ๋ค์ ์ค๋ ๋ฉ์๋์ธ background(), border(), padding()์ด fillMaxSize() ๊ธฐ์ค์ผ๋ก ๊ทธ๋ ค์ง๋ ๊ฒ์ ๋ง์๋ค. ๋ฐ๋ฉด, myModifier๋ ํฌ๊ธฐ ์กฐ์ ๋ฉ์๋์ธ wrapContentSize()๋ฅผ ๋งจ ๋ง์ง๋ง์ ์ฌ์ฉํ๋๋ฐ, ์ด๋ฏธ background(), border(), padding()๊ฐ ๊ธฐ๋ณธ ํฌ๊ธฐ์ธ fillMaxSize()๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ ๊ทธ๋ ค์ง ์ดํ๊ธฐ ๋๋ฌธ์, wrapContentSize()๋ ๋จนํ์ง ์๋๋ค. ์ฆ, myModifier3๋ ์ฌ์ ํ fillMaxSize()๋ผ๋ ๊ฒ์ด๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก, myModifier3์ ๋ฉ์๋ ์ฒด์ด๋์ ์คํจํ๋ค.
#2 Modifier๋ฅผ ์ฌ์ฉํ ์ฝ๋
// package com.example.modifier
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.modifier.ui.theme.ModifierTheme
val myModifier1 = Modifier
.background(color = Color.Gray)
.border(10.dp, color = Color.Magenta)
.padding(10.dp)
val myModifier2 = Modifier
.wrapContentSize()
.background(color = Color(0xFFFFC896))
.border(10.dp, color = Color.White)
.padding(10.dp)
val myModifier3 = Modifier
.background(color = Color(0xFFFFC896))
.border(10.dp, color = Color.White)
.padding(10.dp)
.wrapContentSize() // ์ ๋จนํ. ์ด๋ฏธ fillMaxSize()์ ์ฌ์ฉํ๋ background(), border(), padding()์ด ๋ฉ์๋ ์ฒด์ด๋๋ ํ์ด๊ธฐ ๋๋ฌธ.
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ModifierTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = Color.Black
) {
Greeting("Android", myModifier1)
}
Surface(
modifier = Modifier.fillMaxSize(0.5f),
color = Color.Red
) {
Greeting(name = "Jetpack Compose", myModifier2)
}
}
}
}
}
@Composable
fun Greeting(name: String, modifierParam: Modifier = Modifier) {
Text(
text = "Hello $name!",
fontSize = 32.sp,
color = Color.Blue,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center,
modifier = modifierParam
)
}
#1-2 ~ #1-3์ ์๋ Modifier๋ฅผ ์ด์ฉํด ์ฝ๋๋ฅผ ์งฐ๋ค. 2๊ฐ์ Surface๋ฅผ ์ฌ์ฉํ๋๋ฐ, Layout์ ์ผ๋ก ์๋ฌด๊ฒ๋ ๋ช ์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋์ ๊ทธ๋ฅ ๊ฒน์ณ์ ธ ์์ ๊ฒ์ด๋ค.
#3 ์๋ ํ์ธ
#3-1 myModifier1๊ณผ myModifier2 ์ฌ์ฉ

"Hello Android!"๋ฅผ ํ์ํ๋ Greeting()์๋ myModifier1๊ฐ ์ ์ฉ๋๋ค. myModifier1์๋ ํฌ๊ธฐ์ ๊ดํด ์๋ฌด๊ฒ๋ ๋ช ์ํ์ง ์์๊ธฐ์ ๊ธฐ๋ณธ๊ฐ์ธ fillMaxSize()๊ฐ ์ ์ฉ๋์๊ณ ๋ฐ๋ผ์ Surface๋ฅผ ๊ฐ๋ ์ฑ์ ๋ค. ๊ทธ๋์ Surface์ color ์์ฑ์ ๊ฒ์์์ผ๋ก ์ค์ ํ์์๋, ํ๋ฉด์ ๊ฒ์์์ด ๋ณด์ด์ง ์๋๋ค. myModifier1์ ๋ฐฐ๊ฒฝ์์ธ ํ์์ด Surface๋ฅผ ๊ฐ๋ ์ฑ์๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ด๋ค.
"Hello Jetpack Compose!"๋ฅผ ํ์ํ๋ Greeting()์๋ myModifier2๊ฐ ์ ์ฉ๋๋ค. ์ด Greeting()์ด ๋ด๊ธด Surface ์์ฒด Modifier์ ํฌ๊ธฐ๋ฅผ 1/4๋ก ๋ช ์ํด์ ํฌ๊ธฐ๊ฐ ์๋ค. myModifier2๋ wrapContentSize() ๋ฉ์๋๊ฐ ์ ์ฉ๋์ด Greeting()์ด Surface๋ฅผ ๊ฐ๋ ์ฑ์ฐ์ง ์๋๋ค. ๊ทธ๋์ Surface์ ๋ฐฐ๊ฒฝ์์ธ ๋นจ๊ฐ์์ ํ์ธํ ์ ์๋ค.
#3-2 myModifier1๊ณผ myModifier3 ์ฌ์ฉ

๋ค๋ฅธ ์กฐ๊ฑด์ ์ ์งํ ์ฑ๋ก myModifier2 ์๋ฆฌ์, ์ด๋ฅธ๋ฐ ์คํจํ ๋ฉ์๋ ์ฒด์ด๋์ ํ๋ myModifier3๋ฅผ ๋ฃ์๋ค. myModifier3๋ฅผ ๋ง๋ค ๋ ์ํํ๋, ๋ฉ์๋ ์ฒด์ด๋์ ๋ง์ง๋ง ์ฒด์ธ์ธ wrapContentSize()๊ฐ ์ ์ฉ๋์ง ์์ ๋ชจ์ต์ด๋ค. Greeting()์ด Surface๋ฅผ ๊ฐ๋ ์ฑ์ ๋นจ๊ฐ์ ๋ฐฐ๊ฒฝ์ ํ์ธํ ์ ์๋ค.
#4 ์์ฝ
Modifier๋ UI Setter๋ค.
#5 ์์ฑ๋ ์ฑ
android-practice/jetpack-compose/Modifier at master ยท Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Jetpack Compose - Button (0) | 2024.07.22 |
---|---|
[Android] Jetpack Compose - Layout, Arrangement, Alignment (0) | 2024.07.22 |
[Android] Jetpack Compose - Surface (0) | 2024.07.22 |
[Android] Jetpack Compose - ๊ธฐ์ด (0) | 2024.07.22 |
[Android] Dagger2 - Hilt๋ก ๋ง์ด๊ทธ๋ ์ด์ (0) | 2024.07.12 |