파일들의 역활과 관계

2012.03.25 22:09

Study4U Views:1899

간단한 레이아웃 예제를 하나 만들어 보겠습니다.

 

먼저 이클립스를 실행한후, 다음과 같이 새로운 프로젝트를 하나 생성합니다.

 

ex1

 

 

 

 

 

 

아래 그림처럼, Layout > src > 팩키지 > Layoutex1.java 를 더블클릭한후, 아래 소스를 추가한후, 저장합니다.

 

 

 

package com.cafe24.studyu.ex1;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Layoutex1 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout linear = new LinearLayout(this);
        linear.setOrientation(LinearLayout.VERTICAL);
        
        TextView text = new TextView(this);
        text.setText("배워서남준다");
        
        linear.addView(text);
        setContentView(linear);
    }
}

 

안드로이드 가상 머신을 실행합니다.

그리고, 상단 툴바에 있는 Run 버튼을 클릭합니다.

 

아래 그림처럼 위에서 작성한 프로그램이 출력되는것을 확인할 수 있습니다.

 

 

 

작성된 소스를 확인해 보겠습니다.

 

1. LinearLayout linear = new LinearLayout(this);

화면배치를 위해서 레이아웃을 하나 만드는 구문입니다. 레이아웃 종류가 많은데 그중에 LinearLayout 레이아웃을 사용한것입니다.

 

2. linear.setOrientation(LinearLayout.VERTICAL);

linear 레이아웃의 화면 정렬을 세로로 정렬하겠다고 선언한 구문입니다.

 

3. TextView text = new TextView(this);

화면에 문자열을 입출력하기 위해 TextView 위젯을 선언한 구문입니다.

 

 

4. text.setText("배워서남준다");

 

위에서 선언한 TextView 위젯에 문자열을 입력한 구문입니다.

 

5. linear.addView(text);

위에서 생성한 레이아웃과 위젯을 연결해 주는 역활을 하는 구문입니다. 

linear 라는 객체에  TextView 에서 생성한 문자열 text 를 addView 함수를 통해 뷰(위젯)을 레이아웃에 등록해 주어야만 정상적으로 출력이 됩니다.

 

6. setContentView(linear);

마지막으로 화면에 Linear 레이아웃을 출력시켜주는 구문입니다.

 

 

안드로이드 프로그램 구조에 대해서 조금은 이해가 되셨나요?

 

그럼 계속해서 조금 다른 방법으로 문자열을 입력해 보도록 하겠습니다.

 

text.setText("배워서남준다"); 의 구문을 

text.setText(R.string.hello); 로 바꾸어 입력한후 저장합니다.

Run 버튼을 클릭해서 해당 소스가 어떻게 수행되었는지 결과를 확인해 보세요.

 

Hello World, Layoutex1! 

 

라는 메세지가 화면에 출력되었을 것입니다.

 

Hello World, Layoutex1! 이라는 문자열을 입력하지도 않았는데 어디에서 저런 문자가 입력되었을까요?

 

Hello World, Layoutex1!  라는 문자열이 어디에서 가져와서 출력되었는지 확인해 보겠습니다.

 

아래 그림처럼 좌측의 Package Explorer 창의 gen > 팩키지 > R.java 라는 파일을 더블클릭하면 해당 소스가 출력이 됩니다.

 

 

R.Java 라는 파일은 시스템이 자동으로 생성, 관리하는 파일입니다.

 

 

 

public final class R {  
    public static final class attr {
    }
    public static final class drawable {
        public static final int ic_launcher=0x7f020000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}

 

 

 

소스를 자세히 보시면,  R 이라는 이름을 가진 부모 클래스에, string 이라는 자식 클래스가 있습니다.

그 string 클래스에 보면, hello 라는 상수가 있고 그 hello 의 값에는 시스템에서 활당된 아이디값이 입력되어 있음을 알수 있습니다.

 

hello = 0x7f040000 에서 활당된 아이디값은 누구를 가리키는 것일까요?

아래 그림처럼 좌측의 res > values > strings.xml 파일을 더블클릭해서 보면 strings.xml 에 정의되어 있는 내용을 확인할 수 있습니다.

 

 

 

 

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

    <string name="hello">Hello World, Layoutex1!</string>
    <string name="app_name">Layoutex1</string>

</resources>

 

자세히 보시면, hello 라는 이름의 문자열에 Hello World, Layoutex1! 라는 값이 등록되어 있는것을 확인할 수 있습니다.

 

즉, text.setText(R.string.hello); 에서 정의되어 있는 R.string.hello 는 실제적으로 res > values > strings.xml 파일에 정의되어 있음을 알수 있습니다.

자바 파일은 직접적으로 xml 파일을 참조할수 없기때문에, 중간에 R.Java 파일을 두어서 문자열의 아이디값을 참조하도록 되어 있는 구조입니다.

 

파일의 역활과 구조를 다시한번 설명하면,

Layoutex1.Java 라는 파일에 

 

TextView text = new TextView(this);

 

text.setText(R.string.hello);

 

 

TextView 라는 클래스를 선언하여 사용하면서,  R.string.hello 라는 특정값을 입력하였습니다.

자바파일은 R.Java 라는 파일의 string 클래스의 hello 라는 상수에 실제 아이디값이 정의되어 있습니다.

그 정의되어 있는 아이디값은 res > values > strings.xml 파일에 hello 라는 이름의 string 에 등록된 값을 화면에 출력하도록 되어 있는 구조입니다.

 

 

첫날 학습한 hello.Java 파일에 보면 아래 구문이 있습니다.

 

setContentView(R.layout.main);

 

즉, 이 구문은 시스템에 의해서 자동 관리되어지는 R.Java 파일에 layout 클래스의 main 이라는 상수에 아이디 값이 정의되어 있으며, 그 아이디값은 실제적으로, res > layout > main.xml 파일에 참조되어 있습니다.

main.xml 파일에 보면, 아래와 같이 정의되어 있습니다.

 

 

    <TextView

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/hello" />

 

 

@ 표시는 참조하라는 의미이며, string/hello 는 string 이라는 클래스의 hello 라는 상수값을 참조하라는 의미입니다.

string 이라는 클래스는 마찬가지로 R.Java 파일에 정의되어 있으며, string 은 strings.xml 파일에 hello 라는 이름의 string 에 내용이 담겨있다는 의미입니다.

 

다소 조금 복잡해 보일수 있는데요.

 

좀더 간단히 말하면,

setContentView() 함수는 화면에 출력을 시키는 함수인데.

R.layout.main 은 R.Java 파일의 layout 이라는 클래스의 main 이라는 상수에 아이디값이 저장되어 있는데, 그 아이디값은 실제적으로 res > layout > main.xml 에서 값을 가져오게 되어 있는것입니다.

 

그리고, R.string.hello 는 R.Java 파일의 string 이라는 클래스의 hello 라는 상수에 아이디값이 저장되어 있는데, 그 아디값은 실제적으로 res > values > string.xml 에서 string 이 hello 라는 이름에 등록된 값을 가져오는 것입니다.

 

복잡해 보이지만, 프로그램의 구조만 잘 이해하시면 됩니다.