기존 Android는 XML을, iOS는 StoryBoard를 이용하여 UI를 구성했습니다.

하지만  ❗️❗️❗️

 

최근 Flutter가 출시되고 

iOS는 SwiftUI가 나오면서 선언형 UI에 시대가 다가오고 있습니다.

Android도 질 수 없겠죠

Android에서는 Compose를 출시하게 됩니다.

 

(다 필요없고 그래서 Compose가 도대체 뭐냐 🤔🤔🤔)

 

Flutter를 한번이라도 접해보셨다면 Compose가 낯설지 않을 수 있습니다.

Flutter로 앱 작업을 진행하면

XML처럼 UI를 구성하기 위해 다른언어로된 UI파일이나

StoryBoard처럼 UI 구성을 하기위한 추가적인 작업과 개념이 아닙니다.

기존 로직을 개발하던 소스코드 안에 UI를 구성하는 개념이죠!

 

개발자는 적응의 동물이라고 🐕🐈

모든 새로운 개념들을 모두 적응하며 나아가야합니다.

 

 


 

Create New Compose Project

 

위와 같이 새 프로젝트를 생성해 줍니다.

 

New Project - Empty Compose Activity

 

 

build.gradle(:app) - dependencies compose setting

 

프로젝트 생성 시 항상 우리를 환영해 주는

"Hello Android!"  🤖🤖🤖

 

어떠신가요? 처음 보시는 Compose 소스의 아름다움 🌈

 

프로젝트 디렉터리를 확인해 보시면 

layout XML 파일이 없는 걸 확인할 수 있습니다.

(항상 보이던 게 없으니 마음 한편이 쓸쓸하네요... 🍂)

 

소스 코드를 다시 살펴보면

처음으로 눈에 띄는 새로운 부분들이 있습니다.

 

✔️ setContent

✔️ @Composable

✔️ @Preview

 

 

 


✔️ setContent

 

setContent는 실제 화면에 노출되는 UI구성 

즉 기존에 XML이라고 생각하시면 됩니다.

 

setContent {
    MyApplicationTheme {
        // A surface container using the 'background' color from the theme
        Surface(
            modifier = Modifier.fillMaxSize(),
            color = MaterialTheme.colors.background
        ) {
            Greeting("Android")
            Greeting(name = "Android1")
            Greeting(name = "Android2")
            Greeting(name = "Android3")
        }
    }
}

 

위의 예시로 자세히 살펴보겠습니다. 👀

 

Surface는 요소들을 감싸는 최상위 컨테이너라고 생각하시면 됩니다.

Compose Surface

이와 같은 수정 가능한 속성값들을 지니고 있으며

Modifier.fillMaxSize()는 너비, 높이 모두 전체 채우기를 한다는 뜻입니다.

XML의 match_parent라고 생각하면 될 것 같습니다.

 

위의 예시를 실행시키면 결과가 어떨까요?

 

"Android"

"Android1"

"Android2"

"Android3"

 

이렇게 이쁘게 노출이 될까요?

(라고 생각했던 제 자신이 부끄럽네요..)

 

실행결과는 생각과는 다르게 모두 더럽게 겹쳐져 있는 걸 볼 수 있습니다.

 

Column() {
    Greeting("Android")
    Greeting(name = "Android1")
    Greeting(name = "Android2")
    Greeting(name = "Android3")
}

 

이와 같이 Compose에서는 Column 또는 Row를 사용하여

가로 또는 세로방향으로 나열을 할 수 있습니다.

 

 

 


✔️ @Composable

 

이번에는 Greeting 함수에 대해 살펴보겠습니다.

 

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!")
}

가장 먼저 눈에 띄는 건 @Composable 어노테이션입니다.

@Composable 어노테이션이 붙으면 

Compose에서 만들어질 UI를 뜻합니다.

 

또한 Compose UI에서는 XML의 View의 많은 속성들과 같이

여러 가지 속성들을 제공합니다.

Compose Text View

Text(
    text = "TestGreeting!!!",
    color = MaterialTheme.colors.primary,
    fontSize = 16.sp,
    maxLines = 1
)

이와 같이 해당 View의 원하는 속성값들만 선언하여 사용합니다.

 

 

 


✔️ @Preview

 

XML에서와 같이 UI를 작성한 후 미리 볼 수 있는 기능을 지원합니다.  👀

 

Compose Preview

 

@Preview 어노테이션을 @Composable와 같이 붙여준다면

위의 화면과 같이

Compose로 작성한 UI의 미리 보기가 가능합니다!!!

 

TestGreeting, DefaultPreview 두 Preview의 차이는 배경이죠

(showBackgroud = true)를 설정하여

Preview에서 배경 존재 유무를 설정 할 수 있습니다. 

 

여기서 한 가지 궁금증이 생겨나죠

위의 소스코드에서

fun Greetint(name: String)

요기에만 @Preview가 빠져있습니다.

귀찮아서 제가 빼둔 걸까요?

 

 

" Composable functions with nondefault parameters are not supported in Preview unless they are annotated with @PreviewParameter. "

parameters 있는 functions에서는 Preview를 지원하지 않는다고 합니다.

 

여기까지의 기능이라면 조금 아쉽겠죠?

Flutter가 자랑하는 Hot Reload 또한 지원합니다!!!

(Hot Reload??? 뜨거운🔥? 재장전🔫??)

 

Hot Reload란 UI를 수정하면

실시간으로 실행되는 기기 또는 에뮬레이터에 UI가 수정되는 현상입니다.

기존 XML을 통하여 작업을 했던 시절을 생각한다면

 

1. XML을 통하여 UI를 작업한다

2. Build + RUN 하여 직접 눈으로 확인한다.

3. 약간 수정해야 할 부분을 확인한다. (다시 1번으로)

 

이와 같이 Build + Run 하여 확인 후 다시 XML을 수정하고

또다시 Build + Run 또 다시 수정 또 다시 B+R 또 다시 수정....

 

하지만!!!

 

Compose!!! Hot Reload!!!  🔥🔥🔥🔫🔫🔫

 

 

 

 


여기까지 저의 긴 글을 읽어주셔서 감사합니다.

제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 해 보겠습니다.

 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기