Xml과 Compose의 가장 큰 차이는 명령형과 선언형에 있다고 사람들은 말합니다. 하지만, 저는 이를 이해하기가 상당히 어려웠습니다.
그래서 이번 게시글에서는 명령형과 선언형, 그리고 xml과 Compose의 패러다임에 대해 공부하고자 합니다.
명령형 vs 선언형
명령형 프로그래밍은 안드로이드의 전통적인 UI 개발 방법입니다. 명령형은 말 그대로, 컴파일러에게 원하는 작업을 단계별로 알려주는 방식입니다.
C#을 사용해서 간단한 예를 들어보겠습니다. 아래에는 숫자 5개가 있습니다.
List<int> collection = new List<int> { 1, 2, 3, 4, 5 };
명령형 프로그래밍 방식으로 이러한 숫자들에서 홀수를 찾기 위해서는 아래와 같이 코드를 작성할 수 있습니다.
List<int> results = new List<int>();
foreach(var num in collection)
{
if (num % 2 != 0)
results.Add(num);
}
이러한 방식은 다음과 같은 단계를 가집니다.
1. 홀수를 담을 Result 컬렉션 생성
2. 컬렉션의 각 숫자를 차례대로 검사
3. 숫자를 확인하고 홀수인 경우 Result에 추가
반면에 선언형은 원하는 대상을 설명하는 코드를 작성하지만, 그것을 어떻게 얻을지는 명시하지 않습니다. 무엇을 얻고 싶은지는 명시하지만, 그것을 단계별로 설명하지는 않습니다.
var results = collection.Where( num => num % 2 != 0);
이는 컴파일러에게 "홀수인 경우에 모두 가져와라"라고 말하는 것과 같습니다. 이전의 방식처럼 "홀수를 담을 컬렉션을 만들고, 모든 항목을 순회하여 홀수인지 확인해 담아라!" 라고 말하는 것과는 큰 차이가 있습니다.
다만, 이러한 방식을 구분 짓기는 매우 어렵습니다. 우리는 두 가지의 방식을 혼합하여 사용합니다.
Xml과 Compose는 그럼?
여기서 제가 xml과 compose의 차이가, 명령형과 선언형에 있다는 것을 이해하기 어려웠던 이유를 설명합니다.
먼저 xml은 사람들이 명령형 방식을 사용한다고 말합니다. 그럼 xml을 생각했을 때, 가장 먼저 떠오르는 코드를 한번 보겠습니다.
<TextView
android:id="+@id/tvTextView"
android:text="helloWorld"
...
/>
정말 명령형 방식인가요?? xml에서는 단순하게 값들을 선언하고 있습니다. 이러한 방식은 프로그래밍 관점에서 compose와 크게 다르지 않습니다.
@Composable
fun TextView() {
Text("HelloWorld")
}
그럼 사람들은 왜 xml을 명령형 방식이라고 하는 걸까요?? 이에 대한 해답은 xml을 제어하는 view의 방식에 있습니다.
안드로이드에서 UI를 그리기 위해서는 View들을 트리로 표시하고, 이러한 UI 트리의 루트 노드를 전달해야 합니다.
안드로이드의 View 시스템은 전달받은 View들의 정보를 바탕으로 button.setText(String), container.addChild(View) 또는 img.setImageBitmap(Bitmap)과 같은 메서드를 호출하여 View들을 변경하게 됩니다.
이러한 방식은 동적으로 View를 제어할 필요가 있을 때, 쓰는 방식들입니다.
textView.text = "새로운 텍스트"
// textView.setText("새로운 텍스트")
이를 통해 알 수 있는 것은 "안드로이드에서 xml 방식이 명령형이라고 말하는 것은 xml 자체를 말하는 것이 아니라 xml을 제어하는 View 시스템이 명령형인 것이다." 라는 겁니다.
결론
결론적으로 xml과 compose는 그 자체로는 동일하게 선언형 프로그래밍 방식입니다.
하지만 안드로이드에서 UI를 그리기 위해서는 xml는 필연적으로 명령형 프로그래밍을 사용할 수밖에 없기에, xml이 명령형이다라고 이해했던 것 같습니다.
Reference
Imperative vs. Declarative UI Development with Jetpack Compose
In the world of app development, creating user interfaces has been traditionally approached in an imperative manner. However, with the…
pinarturgut09.medium.com
What is the difference between declarative and imperative paradigm in programming?
I have been searching the web looking for a definition for declarative and imperative programming that would shed some light for me. However, the language used at some of the resources that I have ...
stackoverflow.com
'Android' 카테고리의 다른 글
Android Intent의 내부 동작 방식과 데이터 전달 (0) | 2024.12.11 |
---|---|
안드로이드 멀티 모듈에서 의존성 항목 추가하기 api vs implementation (0) | 2024.08.25 |
그냥 지나쳤던 안드로이드의 크기 단위 (0) | 2024.02.02 |
안드로이드에서 사용자의 위치를 가져오는 방법 (1) | 2024.01.07 |
안드로이드에서 Json을 사용하는 다양한 방법 (0) | 2023.12.03 |