ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 탭을 클릭했을 때 표시되는 화면을 통해 구성된 레이아웃을 미리 볼 수 있다.

    댓글

Designed by Tistory.