서론

해당 포스트는 Android Compose Tutorial Sample Source 에 대해 분석한 내용을 정리하였습니다.

실행화면

Repository

Full Source

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposeTestAppTheme {
                Surface(color = MaterialTheme.colors.background) {
                    NewsStory()
                }
            }
        }
    }
}

@Composable
fun NewsStory() {
    Column(modifier = Modifier.padding(16.dp)) {
        Image(
            painter = painterResource(R.drawable.header),
            contentDescription = null,
            modifier = Modifier
                .height(180.dp)
                .fillMaxWidth()
                .clip(shape = RoundedCornerShape(4.dp)),
            contentScale = ContentScale.Crop
        )
        Spacer(Modifier.height(16.dp))

        Text(
            "A day wandering through the sandhills in Shark Fin Cove, and a few of the sights I saw",
            style = typography.h6
        )
        Text("Davenport, California", style = typography.body2)
        Text("December 2018", style = typography.body2)
    }

}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    ComposeTestAppTheme {
        NewsStory()
    }
}

위 소스를 기반으로 하나 씩 분석하도록 하겠습니다.

@Composable

Android Compose 는 화면을 구성할 때 Composable 함수를 이용합니다. Composable 함수는 @Composable 어노테이션을 선언함으로써 구성하게 됩니다.

위 코드에서 보이는 Text( ... ) 는 아래와 같이 미리 정의된 Composable 입니다.

@Composable
fun Text(text: AnnotatedString, modifier: Modifier = Modifier, ...) {
    ...
}

또한 @Composable 어노테이션를 사용하여 아래와 같이 Composable을 추가하고 호출이 가능합니다.

@Composable
fun NewsStory() {
 ...
}

특정 Composable 은 자식 Composable를 가질수 있으며 자식 Composable 는 또 자식 Composable를 가짐으로써 Composable tree를 구성하게 됩니다. 이는 Flutter의 Widget tree와 매우 유사합니다.

위 코드를 기준으로 Composable Tree는 아래와 같이 구성이 됩니다.

@Preview

Android Compose의 특징 중 하나는 앱을 실행하지 않아도 Preview 화면을 볼 수가 있습니다. Composable 함수에 @Preview 어노테이션을 추가함으로써 원하는 Composable 의 Preview 화면를 아래와 같이 볼수가 있게 됩니다.

이것은 Android XML layout 과 비슷하나 코드를 수정 후 최신 버전을 보기 위해서는 반드시 빌드를 수행해야하는 번거로움이 있습니다.

setContent

액티비티의 setContentsView() 의 역할을 한다고 보면 됩니다. 실제 내부적으로 setContentsView() 를 호출을 하고 있으며 Composable 을 액티비티에 보여주는 역할을 합니다.

ComposeTestAppTheme

Project 명에 따라 자동으로 생성되는 Composable 입니다.

@Composable
fun ComposeTestAppTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable() () -> Unit) {
    val colors = if (darkTheme) {
        DarkColorPalette
    } else {
        LightColorPalette
    }

    MaterialTheme(
            colors = colors,
            typography = Typography,
            shapes = Shapes,
            content = content
    )
}

여기서 중요한 것은 MaterialTheme(...) 로써 기본적인 Material 스타일의 화면을 구성을 도와주기 위한 Composable 함수입니다. Flutter의 Scaffold 와 비슷한 역할을합니다.

MaterialTheme 는 자식 Composable을 가질수 있습니다.

Surface

빈 껍대기의 Composable입니다. Surface 는 백그라운드 색이나 테두리 색을 지정할수 있습니다. Flutter의 Container 와 유사합니다.

Surface 는 자식 Composable을 가질수 있습니다.

Column

Column 는 여러 개의 자식 Composable 를 세로 방향으로 정렬하는 Composable 입니다. 세로 방향의 Linear layout과 유사한 역할을 합니다.

Image

Image 는 로컬에 저장된 이미지 파일을 보여주기 위한 Composable 입니다. 이미지의 scale type 및 사이즈, 라운드 테두리 처리를 할 수 있습니다.

Space

빈 껍대기의 Composable입니다. Composable 사이의 공간을 띄우기 위해 사용이 됩니다. 보통 Column 안에서 사용이 됩니다.

Text

텍스트를 표시하기 위한 Composable입니다. 폰트 스타일, 색, 사이즈를 지정할 수 있습니다.

정리

Android Compose 는 선언적 UI 패턴으로 화면을 구성하게 됩니다. 화면을 구성할 때 layout xml를 사용하지 않고 오직 kotlin으로만 사용합니다. 또한 Composable 단위로 화면의 일부분을 각각 구성하며 여러개의 Composable 를 조합하여 최종적으로 하나의 화면을 구성하게 됩니다.

Reference

TUTORIAL Jetpack Compose Basics

댓글남기기