티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
이번 자료에서는 안드로이드 툴을 사용하여, 기본 프로젝트를 생성할때 자동으로 생성되는 코드의 형식과
의미에 대해서 알아보고 XML 형식으로 구성된 리소스의 필요성과 그 활용방법에 대해서 설명드리도록
하겠습니다. 기본적으로 저희가 이클립스라는 툴을 사용하지 않는다는 전제로 강좌를 진행하기 때문에
이 강좌에서도 이클립스를 활용하는 방법에 대해서는 별도의 언급을 하지 않도록 하겠습니다.
또한 자바에서는 버튼, 에디트, 리스트박스 등을 객체라고 지칭하지만 객체라는 의미가 너무 광범위하기
때문에 의미가 분명하도록 이 강좌에서는 "컨트롤 객체" 또는 "컨트롤" 이라고 지칭하겠습니다.
만약 안드로이드 시스템 개발환경이 구축되어 있지 않다면 아래의 두 웹페이지를 참고하시면 됩니다.
- 이클립스 없이 안드로이드 개발환경 구축하기1 (JDK 설치, 안드로이드 SDK 설치, 에뮬레이터 실행)
http://www.tipssoft.com/bulletin/tb.php/FAQ/902
- 이클립스 없이 안드로이드 개발환경 구축하기2 (프로젝트 생성, 컴파일, 실행)
http://www.tipssoft.com/bulletin/tb.php/FAQ/903
1. "소스 파일"과 "리소스 파일"에 대하여
소스 파일은 우리가 흔히 알고 있듯이 프로그래밍 언어를 사용해서 자신이 만들고자 하는 프로그램을
구현한 파일입니다. 예전에 작성된 프로그램들은 소스 파일만으로 이루어진 프로그램도 많았습니다.
하지만, 프로그램 환경이 점점 더 복잡해지고 사용자 인터페이스가 다양해지면서 인터페이스 구성을
서술식으로 나열해서 소스 파일에 표현하는것은 한계가 왔고 작업효율을 떨어트리게 되어 해결책이
필요하게 되었습니다.
사용자 인터페이스를 그림 그리듯이 구성할 수 있고 이렇게 구성된것을 동일한 형태로 사용할 수
방법에 대해 연구한 결과로 탄생한 것이 리소스라는 개념입니다. 우리가 알고 있는 아이콘이나
비트맵과 같은것만이 리소스가 아니라 사용자 인터페이스를 어떻게 조합하고 어떻게 배치하는가에
대한 정보도 모두 리소스에 포함되는 개념입니다.
결국, 리소스라는 개념은 프로그램에서 실행부와 사용자 인터페이스를 분리할수 있는 개념을
제공하여 인터페이스를 효율적으로 설계하고 유지보수 할수 있도록 도와줍니다. 따라서 대부분의
프로그램들이 리소스라는 개념을 가지고 있습니다.
안드로이드 프로젝트 또한 소스 파일들과 리소스 파일들로 구성되어 있습니다. 여러분들이 알고
있듯이 안드로이드 프로그래밍은 자바 언어를 사용하기 때문에 소스 파일들은 .java 로 이루어져
있습니다. 그런데 하나 특이한 점은 다른 언어들이 리소스 파일을 독자적인 형식으로 관리하는 반면
안드로이드 프로젝트는 리소스를 XML 형식으로 사용하고 있습니다.
XML(extensible markup language) 은 사용자 정의 태그를 통해 데이터를 구조화하여 저장하고,
이기종 응용 프로그램 간에도 구조화된 데이터를 교환하고, 사용할 수 있도록 ISO 에서 제안한 마크업
언어입니다.
XML 이 사용자 정의 태그를 사용하기 때문에 데이터 구조의 확장성이 용이해지므로 꾸준히 업데이트
될 안드로이드 플랫폼의 응용 프로그램 개발에 적합했을 것입니다. 안드로이드 플랫폼에 컨트롤들이
추가되더라도 언어나 파일의 형식에는 지장을 주지 않고, 사용자 정의 태그만 추가하면 사용 가능하기
때문입니다.
또한 XML 이 이미 널리 알려진 언어이기때문에 자바 언어와 더불어 사람들이 보다 쉽게 접근할 수
있고, 안드로이드용 응용 프로그램을 개발하기 위해서 언어를 익히는데 소비하는 시간을 따로 필요로
하지 않아도 될 것입니다.
리소스가 XML 형식으로 되어 있다고해서 XML 을 당장 공부할 필요는 없습니다. 처음 배울때에는
매우 단순한 형식만 사용하기 때문에 기본적인 사용법만 이해하면 됩니다. 하지만 나중에 여러가지
이유로 XML 이 많이 필요하기 때문에 XML 에 대해서는 시간날 때 따로 공부해두는 것이 좋습니다.
2. 기본 프로젝트 살펴보기
새로운 프로젝트를 생성하면 해당 프로젝트의 폴더 내에는 여러개의 폴더와 파일이 생성됩니다.
앞에서 이야기했듯이 이 파일들은 소스 파일과 리소스 파일로 나누어 생각할 수 있으며 소스 파일은
확장자가 .java 이고, 리소스 파일은 확장자가 .xml 로 되어 있는 파일들입니다.
안드로이드 프로젝트는 기본 소스 파일, 배치와 구성에 관련된 리소스 파일, 프로그램에서 사용할
문자열에 관련된 리소스 파일로 구성되어 있습니다.
예를 들어 TipssoftApp 라는 프로젝트를 만들었다면 아래와 같이 3가지 파일이 프로그래밍하는데
일반적으로 필요한 파일들입니다. ( 나머지 파일들은 강좌를 진행하면서 필요할 때마다 추가적으로
설명하도록 하겠습니다. )
TipssoftAppActivity.java // 기본 소스 파일
main.xml // 배치와 구성에 관련된 리소스 파일
string.xml // 프로그램에서 사용할 문자열에 관련된 리소스 파일
컴파일을 하고 나면 r.java 라는 소스 파일이 하나 추가되는데 이 파일은 리소스 파일을 소스 파일에서
이용할 수 있도록 연결해주는 파일이고, 매번 갱신되는 파일이기때문에 사용자가 직접 편집할 필요가
없습니다.
이제 이 파일들에 대해서 하나씩 구체적으로 설명드리겠습니다.
2.1 기본 소스 파일
이 파일에는 응용 프로그램이 어떠한 흐름과 방향으로 수행될 것인지, 응용 프로그램이 보여지는
컨트롤 중에서 어떤 컨트롤의 어떤 행위에 관심을 기울일 것인지, 행위가 발생했을 때에는 어떻게
처리를 할 것인지 등 응용 프로그램의 실행에 관한 부분을 구성해주어야 합니다. 프로젝트 폴더
내에서 기본 소스 파일은 다음과 같은 경로에 존재합니다.
프로젝트 루트 폴더\src\(패키지 경로)\프로젝트명Activity.java
위의 경로에서 나타내는 (패키지 경로) 는 프로젝트 생성시 명시했던 패키지 경로 말하며 만약
com.example.tipssoft 라는 패키지명을 사용했고, 프로젝트명이 TipssoftApp 였다면 경로는
아래와 같이 구성되어 있을 것입니다.
TipssoftAppProject\src\com\example\tipssoft\TipssoftAppActivity.java
기본 소스 파일을 열어서 내용을 살펴보면 다음과 같은 코드가 구성되어 있습니다.
package com.example.Tipssoft;
import android.app.Activity;
import android.os.Bundle;
public class TipssoftAppActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
안드로이드 시스템은 다른 시스템과 달리 하나의 응용 프로그램이 여러개의 실행시점을 가질 수
있도록 설계되어 있고, 이러한 실행시점을 액티비티(Activity) 라고 하며 이러한 개념을 클래스화
시켜놓은 것이 Activity 클래스 입니다.
위의 코드에서 볼 수 있듯이 TipssoftAppActivity 클래스는 Activity 클래스에서 상속된 클래스로
구성되어 있기때문에 이 프로그램의 실질적인 실행부라고 보시면 됩니다.
기본 Activity 클래스를 그대로 사용하면 자신이 구성한 인터페이스를 사용할수 없기 때문에
Activity 클래스의 onCreate 메소드를 재정의하여 이 프로젝트에서 구성한 리소스 파일을
setContentView 함수로 호출하여 사용하면 됩니다.
2.2 배치와 구성에 관련된 리소스 파일
이 파일에는 응용 프로그램에 보여지는 컨트롤들(버튼, 에디트, 리스트뷰 등)을 어떻게 생성하고,
배치하고, 레이아웃할 것인지 등을 구성해주어야 합니다.
안드로이드용 응용 프로그램은 소스 파일에 직접 코드를 작성하여 컨트롤들을 생성할 수도 있지만
XML로 좀 더 쉽고, 편하고, 가볍게 컨트롤들을 구성할 수 있습니다. 기본적인 프로젝트 폴더에는
아래와 같은 경로 내에 컨트롤 리소스 파일이 존재합니다.
프로젝트 루트 폴더\res\layout\main.xml
기본 XML 파일을 열어서 내용을 살펴보면 다음과 같은 코드가 구성되어 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello Tipssoft"
/>
</LinearLayout>
이 파일의 내용을 살펴보면 아래와 같습니다.
- <?xml version="1.0" encoding="utf-8"?>
이 문서는 xml 버전 1.0 형식으로 구성되어 있으며 문자 포맷은 UTF-8 로 구성되어 있다는
의미입니다.
- LinearLayout
XML 문법상으로 <LinearLayout... /> 는 LinearLayout 라는 이름으로 명명된 하나의 요소를
의미합니다. LinearLayout 다음에 나오는 속성을 참조하여 레이아웃을 구성하게 합니다.
레이아웃에 대한 내용은 추후에 자세하게 다루도록 하겠습니다.
- xmlns:android="URL"
특정한 그룹에서 정해놓은 XML 태그 정보를 명시한 URL 에서 얻어온 후 android 라는
네임스페이스로 선언한 것입니다. 1 에서 설명한 것처럼 XML 은 태그를 사용자 정의로 구성할
수 있는데 이 태그를 사용자들에게 마음대로 정의해서 사용하라고 하면 사용자가 정의한 리소스
파일은 안드로이드 툴이 해석할 수 없기때문에 미리 정의해둔 태그 정보들을 가져와서 사용하는
것입니다.
당연한 얘기겠지만 네임스페이스의 선언에 해당하는 xmlns:네임스페이스명="URL" 문장은
해당 네임스페이스 태그들을 사용하는 문단의 가장 선두 태그에 반드시 선언해주어야 하고,
여러 네임스페이스를 사용하는 경우 하나의 태그에서 동시에 여러개를 선언할 수도 있습니다.
태그에 네임스페이스를 명시하여 사용하면 해당 태그명이 네임스페이스 안에 존재하는 것인지
컴파일시 확인을 할 수 있으며, 여러개의 네임스페이스가 존재하여 태그명이 충돌할 경우에도
해당 태그가 어떤 네임스페이스에 속하는 태그인지 정확하게 알 수 있기때문에 에러를 방지할
수도 있습니다. 네임스페이스를 사용할 때에는 다음과 같은 형식을 사용합니다.
네임스페이스:요소 태그명(혹은 속성 태그명)
- android:id="@+id/textview"
XML 문법상으로 android 라는 네임스페이스 안의 id 속성에 값을 설정한 것입니다.
기본 프로젝트를 생성했을 때 구성되는 리소스 파일에는 android:id 코드가 존재하지 않지만
텍스트뷰를 클릭하거나 드래그 하는 등의 컨트롤에 발생하는 액션에 대한 처리를 소스 파일에서
하기위해서는 id 를 사용해야 합니다.
id 나 문자열을 설정할 때에는 " 기호를 이용하는데 " 기호 사이에 있는 값은 명시된 그대로
사용되기도 하고, @ 기호를 문자열의 선두에 붙여서 일련의 해석 과정을 거친 후에 사용하기도
합니다.
id 에 사용하는 값의 경우 해당 값은 추가될 리소스이거나 이미 추가된 리소스를 사용하는것이므로
반드시 @ 기호를 사용하여 아래와 같은 문법에 맞추어 입력해주어야 합니다.
@[+][네임스페이스명:]id/아이디명
[] 는 생략가능한 키워드이며 / 기호까지 알맞은 키워드를 입력한 후에는 사용할 id 명을
입력합니다. id 를 추가하는 경우에는 + 기호를 명시해야하며 만약 이미 존재하는 id 값을
사용하는 경우에는 @id 라고만 명시할 수 있습니다.
경우에 따라서는 이 id 라는 값도 android 네임스페이스에 존재하는 태그명이므로 @android:id
처럼 네임스페이스를 포함하여 명시하여야 합니다.
- android:layout_width, android:layout_height
XML 문법상으로는 android 라는 네임스페이스 안의 layout_width 와 layout_height 속성을
설정한 것입니다. 해당 컨트롤의 너비와 높이를 설정하는 것으로 사용할 수 있는 키워드는
아래와 같습니다.
fill_parent : 부모 스크린의 크기만큼 컨트롤의 너비나 높이를 설정한다.
( 예전에는 fill_parent 를 사용했지만 직관성을 위하여 API8 부터는 match_parent
추가되어 두 값을 혼용한다. 두 값은 모두 -1 로 정의되어 있다. )
wrap_content : 설정한 문자열의 크기에 맞도록 컨트롤의 너비나 높이를 설정한다.
- android:text="문자열"
XML 문법상으로는 android 라는 네임스페이스 안의 text 속성을 설정한 것입니다. text 속성에
문자열을 설정하면 해당 문자열이 컨트롤에 출력됩니다. 출력되는 문자열을 직접 입력해도 되지만
리소스에 문자열을 등록하여 사용할 수도 있습니다.
2.3 프로그램에서 사용할 문자열에 관련된 리소스 파일
이 파일은 응용 프로그램에서 출력되는 문자열을 하나의 파일에 구성하여, 필요시 이 파일만을
편집하여 응용 프로그램 내의 모든 문자열을 관리할 목적으로 사용됩니다.
응용 프로그램을 만들면서 사용되는 문자열은 직접 입력으로도 출력이 가능하지만 이로 인해
문자열이 리소스 파일이나 소스 파일 내에 여기 저기 흩어지게되면 문자열 변경시에 해당 문자열을
일괄적으로 변경할 수 없기때문에 작업이 비효율적으로 이루어집니다.
예를 들어, 스마트폰에서 실행되는 응용 프로그램은 간단해도 유명해지면 다양한 언어로 번역되어
배포될 수 있습니다. 이런 경우 문자열을 직접 입력하여 프로그래밍했다면 문자열을 변경하기
위해서 소스 전체를 살펴봐야하는 불편함이 언어를 바꿀때마다 생길 것입니다. 하지만 문자열
리소스 파일을 활용했다면 해당 파일만 번역가에게 맡겨 각 언어별로 쉽고, 간단하게 변경할 수
있을 것입니다.
그래서 문자열은 이 문자열 리소스 파일에 구성하도록 권장하고 있으며 이 파일은 아래와 같은
경로에 있습니다.
프로젝트 루트 폴더\res\values\strings.xml
기본 소스 파일을 열어서 내용을 살펴보면 다음과 같은 코드가 구성되어 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">TipssoftAppActivity</string>
</resources>
위의 코드에서 등록된 문자열 "TipssoftAppActivity" 은 컴파일시 리소스에 등록되며 사용시에는
소스 파일나 리소스 파일에서 리소스의 name 인 "app_name" 으로 대신 사용됩니다. 문자열
리소스를 사용하는 방법은 다음과 같습니다.
// android:text="TipssoftAppActivity" 와 동일한 결과를 가져온다.
android:text="@string/app_name"
- @ : 리소스 id 를 명시할 때와 마찬가지로 이 항목은 리소스를 사용한다는 것을 의미한다.
- string : 스트링 리소스를 의미한다.
- / : 리소스의 종류와 리소스의 id 나 name 과 같은 값을 분리하는 역할을 한다.
- app_name : 스트링 리소스 중에서 hello 라는 name 을 가진 리소스의 문자열 값을 사용하겠다는
의미이다.
3. R 클래스에 대하여
R 클래스는 리소스를 소스 파일에서 이용할 수 있도록 연결해주는 역할을 합니다. 프로젝트가
컴파일될 때 리소스로 추가될 데이터가 있으면 안드로이드 툴이 R 클래스를 구성하여 r.java 파일을
생성하며 아래의 그림처럼 소스 코드에서 R 클래스를 통하여 리소스에 접근할 수 있도록 해줍니다.
위의 그림을 보면 리소스 파일에 텍스트뷰 하나와 버튼 두개가 구성되어 있습니다. 리소스 코드에서
컨트롤에 부여한 ID 는 해당 리소스 파일이 컴파일될 때 리소스 클래스인 R 클래스 내부의 ID 클래스에
등록되며, 소스 코드에서는 R.id.ID명(R클래스 내부의 id 클래스 내부에 public static final
int 로 선언된 ID명) 을 findViewById 메소드의 인자로 넘겨 호출하여 리소스 파일에서 구성한
컨트롤 중에서 ID와 대응하는 컨트롤을 사용할 수 있습니다.
R 클래스 파일은 프로젝트를 컴파일할 때에만 재생성되기 때문에 한번도 컴파일하지 않은 프로젝트의
경우 파일은 존재하지 않을 수 있으며 존재하는 파일은 사용자가 변경해서는 안됩니다. 만약 컴파일을
통하여 파일이 생성된 경우 해당 파일의 경로는 다음과 같으며 (패키지 경로)의 의미는 2.1 에서 설명한
부분과 동일합니다.
프로젝트 루트 폴더\gen\(패키지 경로)\R.java
기본 리소스 클래스 파일을 열어서 내용을 살펴보면 다음과 같은 코드가 구성되어 있습니다.
package com.example.tipssoft;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040000;
}
}
위의 코드에서 R 클래스 내부의 layout 클래스에 선언된 main 변수는 XML 컨트롤 리소스 파일인
main.xml 을 의미하며 string 클래스의 app_name 변수는 2.3 에 설명한 문자열 리소스 파일에
등록된 문자열의 name 을 의미합니다.
4. 응용 프로그램에 Hello Tipssoft 출력하기
응용 프로그램에서 텍스트를 출력하기 위해서는 텍스트뷰를 사용해야하고, 텍스트뷰를 사용하는
방법은 두가지가 있습니다.
4.1 리소스 파일을 이용하는 방법
기본 프로젝트를 생성했을 때 기본으로 구성되는 리소스 파일과 소스 파일이 이 방법에 해당하며
리소스 파일에 구성된 컨트롤들을 소스파일에서 불러와서 사용하며 기본 소스 코드는 다음과
같습니다.
package com.example.FirstExam;
import android.app.Activity;
import android.os.Bundle;
public class FirstExamActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
위의 코드에서 settContentView 함수는 응용 프로그램에 보여질 컨트롤을 설정할 때 호출하는
함수입니다. R.layout.main 은 리소스를 구성한 XML 파일명 main.xml 을 말하며 해당 리소스
값은 R 클래스 내부의 layout 클래스에 public static final int main 으로 선언되어 있습니다.
4.2 소스 코드로 컨트롤을 생성하는 방법
리소스 파일에서 리소스를 구성하지 않고 자바 소스 코드 내부에서 직접 컨트롤을 생성해서 응용
프로그램에 배치하고자 할 때 사용하는 방법이며 다음과 같이 코드를 구성할 수 있습니다.
package com.example.FirstExam;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class FirstExamActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 텍스트뷰 생성
TextView tv = new TextView(this);
// 텍스트뷰에 문자열 설정
tv.setText("Hello, Tipssoft");
// 텍스트뷰를 어플리케이션에 보이도록 설정한다.
setContentView(tv);
}
}
위의 코드는 어떠한 리소스도 사용하지 않고, 오로지 소스 코드를 이용하여 컨트롤을 생성하고,
배치한 것입니다. 이렇게 컨트롤이 하나만 존재하는 코드는 간단하게 자바 코드로도 구성할 수
있지만 중첩된 레이아웃과 컨트롤의 배치가 필요할 시에는 매우 복잡해집니다.


댓글