컴포즈?
Jetpack Compose는 네이티브 UI를 빌드하기 위한 Android의 최신 UI Toolkit으로, UI를 선언형(Declarative)으로 구성할 수 있게 해준다.
더 적은 수의 코드, 강력한 도구들, 직관적인 Kotlin API로 Android에서의 UI 개발을 간소화하고 가속화하여 앱에 생동감을 더해줌으로써 UI를 더 빠르고 쉽게 만들 수 있게 해준다.
명령형 UI? 선언형 UI?
명령형 UI
명령형 UI는 어떻게(UI를 그릴지)를 단계적으로 정의하고 구현하는 방식이다.
UI 구성과 상태 업데이트를 명시적으로 처리해야 한다.
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
val textView = findViewById<TextView>(R.id.textView)
val button = findViewById<Button>(R.id.button)
button.setOnClickListener {
textView.text = "Button Clicked!"
}
[특징]
- View 또는 Layout을 직접 조작하며, 상태가 변경될 때 UI를 업데이트하기 위해 명령어를 실행해야한다.
- 기존의 Android XML + Java/Kotlin View 시스템이 명령형 UI 방식의 대표적인 예.
[단점]
- UI와 상태 관리 코드가 분리되어 복잡도가 증가.
- UI 상태 변화 시, View를 수동으로 업데이트해야 하고, 오류가 발생할 가능성이 높다.
- ex) 화면에서 방금 제거된 View 노드의 값을 바꾸려는 시도
- 코드의 양이 많아지고 유지보수가 어려움.
선언형 UI
선언형 UI는 무엇을(UI의 상태가 어떠해야 하는지)를 정의하는 방식이다.
데이터 상태를 기반으로 UI가 자동으로 갱신된다.
@Composable
fun GreetingScreen() {
var text by remember { mutableStateOf("Hello World!") }
Column {
Text(text = text)
Button(onClick = { text = "Button Clicked!" }) {
Text("Click Me")
}
}
}
[특징]
- 개발자는 UI가 최종적으로 어떤 모습이어야 하는지만 선언
- UI와 상태를 결합하여 변경된 상태를 기반으로 UI를 다시 그린다. 따라서, 개발자는 State변화에만 집중을 하면 된다.
[장점]
- 상태(state)가 변경되면 UI가 자동으로 업데이트된다.
- UI와 상태 관리를 하나의 함수에서 처리하므로 코드의 일관성이 있고, 관리에 용이하다.
- 코드의 양이 줄어들고 가독성이 좋아진다.

왜 써야 할까?
간결한 코드
- 코드를 적게 작성함으로써 작성자는 테스트와 디버깅 그리고 버그 발생 가능성이 줄어들게 되고,
코드를 읽는 이들은 읽고, 이해하고, 검토할 코드가 적어진다.
- Compose를 사용하면 Android View시스템을 사용할 때에 비해 더 적은 코드로 많은 작업을 할 수 있다.
- 더 이상 Kotlin과 XML로 나누지 않고 Kotlin으로만 작성함으로써 코드 추적, 작성 및 유지보수가 용이하다.
직관적이다
- 직관적이고 찾아 사용하기 쉬운 API를 제공함으로 빠르게 학습하고 사용할 수 있다.
- 특정 Activity나 Fragment에 종속되지 않는 작은 Stateless Component를 만듦으로써 재사용이 용이하고 테스트가 쉬워진다.
빠른 개발(상호 운용이 가능하다)
- Compose는 기존의 모든 코드와 호환된다. Compose에서 Views를, Views에서 Compose 코드를 호출할 수 있다.
- Navigation, ViewModel, Kotlin 코루틴과 같은 대부분의 일반적인 라이브러리는 Compose와 함께 작동하므로 점진적 적용이 가능하다.
- 기존 Android View에서 기본적으로 제공하지 않는 그림자, 그라데이션 속성 등을 쉽게 구현할 수 있다.
- Android Studio에서 Live Preview와 같은 기능을 제공해주어 반복된 코드 작업을 빠르게 수행할 수 있다.
- 오류 상태나 여러 가지 글꼴 크기저럼 상태와 설정이 다양한 UI 컴포넌트를 확인해야 할 경우 유용하다.
성능
- Compose는 Android 플랫폼 API에 직접 액세스하므로 성능을 최적화 시킬 수 있다.
- Compose의 렌더링 엔진은 효율적인 리컴포지션을 통해 변경된 부분만 다시 그리기 때문에 불필요한 렌더링을 최소화하고 성능을 향상시킨다.
- Compose는 중첩된 레이아웃을 효율적으로 처리하므로, 복잡한 UI를 만들 때 유용하다.
참고자료
Compose 이해