์๋๋ก์ด๋ ์ฑ์ ๋ง๋ค ๋ ๊ฑฐ์ ํ์์ฒ๋ผ ์ฐ์ด๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด, 2017๋ ๋ถํฐ Google์ด ๊ณต์ Android ๊ฐ๋ฐ ์ธ์ด๋ก ์ฑํํ์ ๋งํผ ์ค์๋๊ฐ ๋์
ํน์ง
๊ฐ๊ฒฐํจ: ์ฝ๋๋ฅผ ์งง๊ณ ๊น๋ํ๊ฒ ์ธ ์ ์์
์์ ์ฑ: ๋(null) ๊ด๋ จ ์๋ฌ ๊ฐ์
ํ๋์ ์ธ ๋ฌธ๋ฒ: ๋๋ค, ํ์ฅ ํจ์, ๋ฐ์ดํฐ ํด๋์ค ๋ฑ ์ต์ ๋ฌธ๋ฒ ์ง์
Java์ 100% ํธํ ๊ฐ๋ฅ
val name: String = "ํ๊ธธ๋" // ์ฝ๊ธฐ ์ ์ฉ (๋ถ๋ณ)
var age: Int = 24 // ๋ณ๊ฒฝ ๊ฐ๋ฅ
val : ํ ๋ฒ ์ ํ๋ฉด ๋ฐ๊ฟ ์ ์๋ ๊ฐ
var : ๋์ค์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ ๋ณ์
๋ณดํต ๋ณ๊ฒฝํ ํ์ ์๋ ๊ฐ์ val๋ก, ๊ผญ ๋ฐ๋์ด์ผ ํ๋ ๊ฐ๋ง var๋ก!
val message = "์๋
" // String์ผ๋ก ์๋ ์ถ๋ก
val count = 5 // Int๋ก ์ถ๋ก
Kotlin์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ํน์ง ์ค ํ๋๋ ๋ ์์ ์ฑ์ด๋ค.
var nickname: String? = null // ?๋ฅผ ๋ถ์ด๋ฉด null ํ์ฉ
println(nickname?.length ?: 0) // null์ด๋ฉด 0 ์ถ๋ ฅ
Jetpack Compose๋ ์ ์ธํ UI ๋ฐฉ์์ ์ฌ์ฉํ๋ Android UI ํดํท์ผ๋ก, ์ด์ ์ ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ด XML ์์ด๋ ์ฝ๋๋ก UI๋ฅผ ๋ง๋ค ์ ์๋ค.
@Composable ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํจ์๋ UI๋ฅผ ๊ตฌ์ฑํ๋ ๋ธ๋ก์ผ๋ก,
์ฝ๊ฒ ๋งํด์ XML๋ก UI๋ฅผ ์ง๋ ๊ฑธ ํจ์๋ก ์ง์ ๊ทธ๋ฆฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
@Composable
fun HelloText() {
Text(text = "์๋
ํ์ธ์!")
}
์ด ํจ์๋ ํ๋ฉด์ ํ ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ญํ
Text, Button, Column ๋ฑ Compose ์ ์ฉ UI ์์๋ค์ Composable ํจ์ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ!
์ปดํฌ์ ๋ธ ํจ์๋ ์ํ(State)๋ฅผ ๊ฐ์ง๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋๋ ์ ์๋ค.
๐ ๋น์ํ ์ปดํฌ์ ๋ธ
@Composable
fun Title() {
Text("Compose")
}
๐ ์ํ ์ปดํฌ์ ๋ธ
UI + ์ํ ๋ณด์ , ๊ฐ ๋ณํ์ ๋ฐ๋ผ ์๋ ์ฌ๊ตฌ์ฑ๋จ
remember์ mutableStateOf๋ฅผ ์ด์ฉํด ์ํ ์ ์ฅ
๊ฐ์ด ๋ฐ๋๋ฉด ์๋์ผ๋ก ํด๋น UI๋ง ๋ค์ ๊ทธ๋ฆผ
@Composable
fun ClickCounter() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("Clicked $count times")
}
}
@Composable
fun Greeting(name: String) {
Text("Hello, $name!")
}
@Composable
fun Screen() {
Greeting("๊ธธ๋")
Greeting("ํ๊ธธ๋")
}
@Composable
fun MyScreen() {
Column {
Text("์ ๋ชฉ")
Button(onClick = { /* ์ด๋ฒคํธ */ }) {
Text("ํด๋ฆญ!")
}
}
}
ํ์ด๋ฐ์ด์ ์ปดํฌ๋ํธ๋ Compose์ ๊ธฐ๋ณธ์ ์ธ UI ๊ตฌ์ฑ์์
์ฃผ๋ก ๋ฐฐ์น, ํฌ๊ธฐ, ์ ๋ ฌ ๋ฑ ๋ ์ด์์์ ๋ผ๋๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉ๋๋ค.
@Composable
fun SimpleLayout() {
Column(
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("์๋
ํ์ธ์")
Spacer(modifier = Modifier.height(10.dp))
Text("๋ฐ๊ฐ์ต๋๋ค")
}
}
Material ์ปดํฌ์ ๋ธ์ ๊ตฌ๊ธ์ ๋จธํฐ๋ฆฌ์ผ ๋์์ธ ์ฒ ํ์ ์ ์ฉํ ์ปดํฌ๋ํธ
๋ฒํผ, ์นด๋, ์ค๋ต๋ฐ ๋ฑ ์ต์ํ UI๋ค์ด ์ฌ๊ธฐ์ ํฌํจ๋๋ค.
@Composable
fun MaterialSample() {
Scaffold(
topBar = {
TopAppBar(title = { Text("My App") })
},
floatingActionButton = {
FloatingActionButton(onClick = {}) {
Icon(Icons.Default.Add, contentDescription = "์ถ๊ฐ")
}
}
) {
Text("๋ฉ์ธ ํ๋ฉด")
}
}
Scaffold๋ ๊ธฐ๋ณธ ๋ ์ด์์์ ์ ๋ฆฌํ ๋ ํ์ ์์!
์ฑ์ ์๋จ ๋ฐ, ํ๋จ ๋ฐ, ํ๋กํ
๋ฒํผ ๋ฑ์ ๊ฐํธํ๊ฒ ๋ฃ์ ์ ์๋ค.
- @Composable ํจ์๋ Compose์ UI ๋จ์!
- ์ํ ์ ๋ฌด์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง
- ํ์ด๋ฐ์ด์ ์ ๋ ์ด์์, ๋จธํฐ๋ฆฌ์ผ์ UI ์ปดํฌ๋ํธ์ ์ด์
์ฝํ๋ฆฐ์ ๊ธฐ์ด ๋ฌธ๋ฒ๋ถํฐ ์์ํด์ ์ปดํฌ์ ๋ธ ํจ์์ ์ํ ๊ด๋ฆฌ, ๋จธํฐ๋ฆฌ์ผ ์ปดํฌ๋ํธ๊น์ง ์ ๋ฐ์ ์ธ ๊ฐ์๋ฅผ ์ ๋ฆฌํด๋ณด์๋ค. ์์ผ๋ก ๋ ์ฌํ๋ ๊ฐ๋ ๋ค๊ณผ ์์ ๋ค์ ๊ณต๋ถํ๋ฉฐ ์ค์ ์ฑ ๊ฐ๋ฐ๊น์ง ๊ฐ๋ณด๋๋ก ํ๊ฒ ๋ค!