Developing Myself Everyday
article thumbnail

 

사진: Unsplashhannah joshua

 

 

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

 

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!