안드로이드

[Jetpack Compose] 위젯에 대해

2023. 1. 6. 23:26

 

기존의 명령형 UI 개발 방식에서는 setContentView() 함수를 이용해 Activity 에 표시할 xml 을 불러왔었다.

선연형 UI 개발 방식인 Jetpack Compose 에서는 xml 을 사용하지 않으므로 setContentView() 함수 대신 setContent {} 를 사용하고 이 내부에 여러 위젯들을 작성하는 방식으로 레이아웃을 표시한다.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            // 여기에 위젯들 선언
        }
    }
}

 

위젯이 뭔데

Jetpack Compose 는 여러가지 위젯을 이용해 UI 를 개발한다.

 

텍스트를 표시할 때 사용되는 Text() 위젯, 이미지를 표시할 때 사용되는 Image() 위젯, 공간을 지정할 때 사용되는 Box() 위젯 등 각 상황에 알맞은 위젯을 선언함으로서 뷰를 구성한다.

 

빨강색 글자이고 10 dp 의 Padding 을 가진 텍스트 뷰를 선언하는 샘플 코드이다.

Text(
	modifier = Modifier.padding(10.dp),
	color = Color.Red,
	text = "텍스트 입니다",
)

각 위젯들에는 위 샘플 코드에서의 modifier, color, text 같이 뷰를 커스텀할 수 있는 property 들이 존재한다.

따라서 상황에 맞는 적절한 property 들을 이용해 뷰를 구성할 수 있다.

 

위 샘플 코드에서 보이는 modifier 같이 대다수의 위젯에 존재하는 property 들도 있지만, 특정 위젯들에만 존재하는 text 와 같은 property 들도 있어 많은 사용을 통해 익숙해져야 할 것 같다.

 

근데 비즈니스 로직이랑 같이 있으면 너무 길고 지저분해질것 같은데

선언형 UI 개발의 장점 중 하나는 code based 로 UI 를 개발할 수 있다는 것이다.

 

따라서 코드의 재사용성이 높아지는데, 위 샘플 코드에서 만든 텍스트 뷰를 2개 더 생성해 총 3개의 텍스트 뷰가 필요하다고 치자.

그럼 그냥 단순하게 생각해보면 아래와 같은 형태의 코드일 것이다.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Text(
                modifier = Modifier.padding(10.dp),
                color = Color.Red,
                text = "1번 텍스트 입니다",
            )
            Text(
                modifier = Modifier.padding(10.dp),
                color = Color.Red,
                text = "2번 텍스트 입니다",
            )
            Text(
                modifier = Modifier.padding(10.dp),
                color = Color.Red,
                text = "3번 텍스트 입니다",
            )
        }
    }
}

동일한 property 의 동일한 위젯을 3개 생성해놨다.

여기서 조금만 더 생각해 선언형 UI 의 강점인 코드의 재사용성을 살린다면 아래와 같은 코드로도 변경할 수 있다.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            RedText("1번 텍스트 입니다")
            RedText("2번 텍스트 입니다")
            RedText("3번 텍스트 입니다")
        }
    }
}

@Composable
fun RedText(textValue: String) {
    Text(
        modifier = Modifier.padding(10.dp),
        color = Color.Red,
        text = textValue,
    )
}

코드량도 줄어들었고 가독성도 훨씬 좋아진 것을 확인할 수 있다.

 

@Composable 이 무슨 뜻이죠

Jetpack Compose 에서 레이아웃을 구성하는 setContent{} 내부에서는 Composable 함수들만 호출할 수 있다. Composable 함수는 @Composable 어노테이션을 붙여 선언할 수 있다.

 

추가로, @Preview 어노테이션이 붙은 Composable 함수를 볼 수 있는데 이 함수 내부에 정의된 위젯들은 Android Studio 우측 상단의 Split 탭을 클릭했을 때 표시되는 화면을 통해 구성된 레이아웃을 미리 볼 수 있다.