layered

1. XML 본문

안드로이드/안드로이드 앱 프로그래밍

1. XML

스윗푸들 2023. 4. 12. 21:59

개념


Extensible Markup Language

 

HTML과 비슷한 마크업 언어이지만 단순히 데이터를 표현하기 위한 것에서 나아가 저장하고 전송할 목적으로 만들어졌다.

가장 차별화되는 점이 있다면 태그를 자유롭게 정의할 수 있다는 것으로, 이는 XML의 확장성에 기여한다.

일단은 다목적언어이기 때문에 안드로이드에서도 쓰이며, UI를 구현한다! 정도만 알고 넘어가자.

 

구조


다음은 버튼이 하나 있는 기본적인 XML 코드이다.

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="264dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

여러 태그들이 트리 구조로 되어 있으며, 태그 내의 속성들은 공백으로 구분되어 있는 걸 알 수 있다.

하나씩 살펴보자!

 

<?xml version="1.0" encoding="utf-8"?>

 

첫줄은 이 파일이 XML 형식으로 된 것임을 알려준다.


<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

 

그 다음에 오는 태그는 화면 전체를 감싸고 있는 레이아웃으로, Component Tree에서 가장 위쪽에 있으므로 최상위 레이아웃이라고 하기도 한다.

 

그런데 태그 이름이 조금 복잡한데 ConstraintLayout이 외부 라이브러리로 분류되어서 패키지 이름까지 같이 기록한 것이다. 만약 위젯이나 레이아웃이 안드로이드 기본 API에 포함되어 있다면 그냥 이름만 입력하면 된다.


xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"

 

xml namespace

외부 라이브러리에 있는 속성을 사용해야 하는데 어떤 두 라이브러리에 이름이 같은 속성이 있으면 어떻게 될까? 안에서는 상관이 없겠지만 밖으로 불러오면 이게 무슨 속성인지 식별할 수 없는 문제점이 생긴다.

 

어.. 음..

 

namespace는 말그대로 이름 공간으로 여러 변수들을 하나로 묶는다. 쉽게 말하자면 폴더라고 생각하면 된다. namespace가 다르면 이름이 같아도 다른 변수이기 때문에 충돌을 방지하는 기능을 한다.

 

그러므로 위의 xmlns 코드는 namespace를 정의해 외부 라이브러리를 불러오는 부분이라고 할 수 있다.

 

xmlns:접두사="URI"

 

와 같이 사용한다. 접두사는 나중에 속성을 사용할 때 그 앞에 붙어서 namespace를 구분하는데(ex. android:id), 그냥 변수 이름이라고 생각하면 된다. 

URI는 불러올 외부 라이브러리를 식별하는 역할을 한다. 다음은 xmlns의 대표적인 예시이다.

 

xmlns:android 안드로이드 기본 SDK에 포함되어 있는 속성 사용
xmlns:app 외부 라이브러리 속성 사용
xmlns:tools 안드로이드 스튜디오의 디자이너 도구 등에서 화면에 보여줄 때 사용

 

android의 속성들은 상당히 많이 사용되므로 익숙할 것이다.

그냥 임의의 외부 라이브러리를 불러오는 app은 위에서 언급한 바와 같이, 정해진 것이 아니라 단순히 접두사일 뿐이므로  굳이 app이라는 이름을 사용하지 않아도 된다(고는 하지만 그냥 관례를 따르자).


android:id="@+id/button1"

 

id는 뷰를 구분하는 속성이다. 뷰 객체의 이름이라고 할 수도 있겠다.

디자이너 도구 화면에서는 id 부분에 그냥 이름만 작성하면 되지만, XML 파일에서는 [@+id/이름]의 형식으로 적어 주어야 한다.

 

동일한 위젯을 여러 번 추가하면 id 값이 button1, button2, button3 ... 과 같이 순차적으로 부여된다.