Android Compose

2022. 9. 28. 17:48android

Android Compose란 무엇인가?

Jetpack Compose는 Android에서 UI를 만들기 위해 새롭게 선보인 기능입니다.
Swift와 같이 선언형 UI로 View를 그립니다.

선언형 UI 란 UI의 변화가 있을 때 변화된 UI 자체를 새로 만들어 View로 보여주는 방식입니다.
이게 무슨 말이냐.
기존에는 UI를 만들 때 명령을 내려서 만들었습니다.
버튼 클릭으로 인해 View에 변화가 생기는 일이 발생한다면
버튼에 연결된 View와 View에 연결된 객체를 갱신하도록 전부 바꿔주고 관리하고 연결하고
과정을 싹 다 했었습니다.

그런데 선언형 UI는 버튼 클릭으로 객체가 변경되고 그에 따라 View가 변경될 때
변경되는 값만 신경 씁니다.
값이 변경되면 아예 새로 싹 다 그리도록 만들었습니다.
다시 그리면 너무 비용이 많이 들지 않을까??
그건 프레임워크에서 최적화를 해두었다고 합니다.
그러니까 만들어서 쓰게 하지 않았을까 생각도 합니다
굳이 그 똑똑이들이 성능 안 좋은걸 사람들에게 쓰라고 말하진 않을 테니까요

아래에 코드를 한번 보면

@Composable
fun TextField(
    modifier: Modifier,
    focusRequester: FocusRequester,
    focusChange: (FocusState) -> Unit,
    text: String,
    onValueChange: (String) -> Unit,
    color: Int,
    hint: Boolean,
    hintText: Int,
    singleLine: Boolean
) {
    val textColor = if (color == Color(0xFF1B1B1A).toArgb()) Color.White else Color.Gray
    Box(
        modifier = modifier
    ) {
        BasicTextField(
            modifier = Modifier
                .fillMaxWidth()
                .focusRequester(focusRequester)
                .onFocusChanged { focusChange(it) },
            value = text,
            onValueChange = { onValueChange(it) },
            singleLine = singleLine,
            textStyle = LocalTextStyle.current.copy(color = textColor),
            cursorBrush = SolidColor(textColor)
        )
        if (hint)
            Text(
                text = stringResource(id = hintText),
                color = textColor
            )
    }
}

@Composable이라고 annotaion을 달아주고
함수의 인자로 뭐가 막 있습니다.
modifier, focusRequester, focusChange, text, onValueChange 등 뭐가 막 있습니다.
처음 보면 이게 도대체 뭐야?? 할 수 있지만
중요한 건 변하는 것들입니다. 그것만 기억하면 됩니다.

TextField 니까 당연히 우리는 Text를 키보드로 계속 치게 될 것입니다.
그럴 때마다 여기 TextField 가 계속 그려집니다.
한 글자 하나씩 칠 때마다 계속 새로 그립니다.
매개변수의 onValueChage의 변화하는 Text에 따라 계속 변경되는 값을 저장하고 변경될 때마다 해당 Compose를 다시 그립니다.
그리고 또 변할 수 있는 것들을 적을 수도 있습니다.
그래서 focusChange 이런 것들도 적혀있습니다.
왜?? Focus가 달라지면 다시 그려! 하니까요

현재 저는 개인 프로젝트를 만들 때 모두 Compose를 이용하여 만들었습니다.

쓰면 쓸수록 너무나 간편함을 느끼고 전에 동적으로 VIew들을 생성하거나 XML을 이용해 그리고 객체와 연결해주는 작업보다 더 간편하고 관리하고 좋고 코드가 훠어어어얼씬 간결하고 짧아져서 쓰기 좋다고 생각합니다.
앞으로 무조건 선언형으로 바뀌게 될 거라고 생각합니다.