Andoid 2. 애플리케이션의 기본 구조
Andoid 2. 애플리케이션의 기본 구조
1. 안드로이드 앱의 구성
안드로이드 애플리케이션은 컴포넌트(component) 들로 구성
* 컴포넌트
애플리케이션을 만드는 빌딩 블록
하나의 독립된 엔티티로 존재
정해진 역할 수행
애플리케이션을 시작하는 진입점을 가질 수 있음
* 컴포넌트 종류
- activity
사용자 인터페이스 화면을 가지고 하나의 작업을 담당
하나의 앱은 여러개의 액티비티를 가질 수 있음
하나의 화면은 하나의 액티비티
Activity 클래스를 상속 받아서 작성
- service
백그라운드에서 실행
오랫동안 실행되는 작업이다 원격 프로세스를 위한 작업을 할 때 사용
화면을 가지지 않음
Service 클래스를 상속 받아서 작성
(예 - 배경 음악 연주 등)
- broadcast receiver
방송을 받고 반응하는 컴포넌트
많은 방송들은 시스템에서 발생 (배터리가 낮거나 사진이 촬영되는 등)
Broadcastreceiver 클래스를 상속 받아서 작성
일반적으로 인터페이스를 갖지 않음
(예 - 푸쉬 알림)
- content provider
데이터를 관리하고 다른 앱에 데이터를 제공
파일 시스템이나 SQLite 데이터 베이스, 웹 상에 저장될 수 있음
다른 앱들이 content provider를 통해서 데이터를 쿼리 하거나 변경 가능
다른 앱과 DB 사이의 연결다리 역할
ContentProvider 클래스를 상속 받아서 작성
모든 컴포넌트를 다 이용할 필요는 없고 상황에 맞게 필요한 컴포넌트만 이용
* 다른 앱의 컴포넌트 실행
안드로이드 앱은 다른 앱의 컴포넌트를 이용할 수 있음
여러 개의 앱들이 특정한 컴포넌트를 공유해서 사용하는 것이 가능
코드나 링크 필요 없이 사용하려는 앱의 컴포넌트를 실행하기만 하면 됨
예시 - 사진 촬영이 필요한 경우 코딩을 통해 직접 기능을 구현하는 것이 아니라 사진 촬영 기능을 제공하는 카메라 앱의 컴포넌트 사용 가능
* 인텐트 (intent)
앱에서 자신이 원하는 컴포턴트를 찾아서 실행하도록 해주는 비동기적 메시지
앱의 의도를 적어서 안드로이드에 전달하면 안드로이드가 가장 적절한 컴포넌트를 찾아서 활성화 하고 실행
2. 앱 작성 절차
안드로이드 앱은 기본적으로 Java 파일, XML 파일, 리소스 파일로 이루어짐
Java 소스 : 앱의 로직
XML 파일 : 앱의 UI
리소스 파일 : 사운드나 이미지 등
- 앱 작성 절차
1) UI 작성
XML을 이용해서 인터페이스 화면 디자인
직접 XML파일을 편집하거나 안드로이드 스튜디오의 비주얼 도구 사용
만들어진 파일들은 레이아웃 파일이라고 함
2) Java 코드 작성
필요한 클래스를 작성하거나 안드로이드에서 제공하는 라이브러리 클래스 사용
3) 매니페스트 파일 작성
앱을 구성하는 컴포넌트 기술
필요한 권한 지정
XM, Java, 매니페스트 파일을 합지면 하나의 앱이 됨
3. 앱 구성 소스 파일
java : Java 소스 파일들이 들어있는 폴더
Gradle Scirpts : 빌드 시에 필요한 Cradle
res : 각종 리로스들이 저장
drawble : 해상도별로 아이콘 파일들 저장
layout : 화면의 구성 정의
values : 문자열과 같은 리소스
menu : 메뉴 리소스
manifest : XML 파일로 앱의 전반적인 정보(앱 이름, 컴포넌트 구성 등)
프로젝트를 생성하면 app라는 모듈이 자동 생성 -> 하나의 앱
(하나의 프로젝트에는 여러개의 앱이 들어있을 수도 있음)
1) Java 파일
java -> 패키지 -> MainActivity (자동 생성됨. 액티비티를 직접 생성한 경우 다른 이름일 수 있음)
package kr.co.company.test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
package : 패키지(서로 관련있는 클래들을 모아놓은 컨테이너)를 선언
import : 외부의 패키지나 클래스를 소스에 포함시킴
패키지 앞에 androidx가 붙는 패키지는 JetPack에 속하는 클래스인데 최근 호환성을 위해 사용이 권장됨
class : 액티비티 클래스 선언. 액티비티는 Activity 클래스를 상속받는데 Activity 클래스의 자식 클래스인 AppCompatActivity 클래스를 상속받아서 작성됨
onCreate() : 부모 클래스의 메소드를 재정의. 안드로이드 시스템에 의하여 액티비티가 생성되는 순간 딱 한 번 호출됨. 모든 초기화화 사용자 인터페이스 설정이 여기서 이루어짐. 매개변수로 앱이 이전에 실행되었던 생태를 전달
set.ContentView() : 액티비티의 화면을 설정하는 함수. R.layout.activity_main은 R 클래스 안의 layout 맴버 안의 activity_main을 의미
2) 그레이들 (Gradle)
안드로이드 앱의 빌드 도구 -> 실행파일을 만드는데 활용
앱을 빌드하는데 필요한 라이브러리 버전을 자동으로 파악해서 필요하면 다운로드
* build.gradle
그레이들 설정 파일
Project와 Module이 있음
Project : 프로젝트에 대한 빌드 설정. 별 내용이 없음
Module : 앱을 빌드하는데 필요한 중요한 설정 사항들이 많이 있음
android {
namespace 'kr.co.company.test2'
compileSdk 33 // 컴파일 할 안드로이드 SDK 버전 정보
defaultConfig {
applicationId "kr.co.company.hello"
minSdk 24 // 해당 앱을 설치할 수 있는 최소 SDK 버전
targetSdk 33 // 개발할 때 목표로 하는 타겟 SDK 버전
versionCode 1 // 앱스토어에 배포할 때의 버전
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
}
}
compileOptions {
// Java 언어의 버전
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
3) 리소스
레이아웃, 이미지, 문자열 등
drawble : 해상도별로 아이콘 파일들 저장
layout : 화면의 구성 정의
values : 문자열과 같은 리소스
menu : 메뉴 리소스
- 레이아웃
화면을 어떻게 구성할 것인지 정의
어떤 위젯들을 어떻게 배치하 럯인지 레이아웃에서 결정
안드로이드에서는 화면 구성을 XML을 이용해서 선언적으로 하도록 권장
res -> layout -> activity_main.xml (액티비티를 직접 생성했다면 이름이 다를 수 있음)
현재 보이는 화면을 XML 파일로 작성한 것.
우측 상단의 Code, Split, Design 탭을 클릭하면 각각 코드, 분활 화면, 그래픽 화면으로 볼 수 있음 Design 화면에서는 위젯들을 마우스로 끌어와서 UI를 구현할 수 있음.
Code
<?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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?> : 해당 문서가 XML 문서임을 나타냄
ConstraintLayout : 위젯들을 상대적으로 배치하는 배치 관리자
TextView : 화면에 텍스트를 표현하는 요소.
TextView 외에도 위젯들에 따라 여러가지 요소들을 추가할 수 있음
* 요소들의 여러가지 속성
xmlns:android : 안드로이드 이름공간에 정의된 속성들을 참고하려고 한다는 것 암시. XML 파일에서 항상 최외곽 태그는 이 속성을 정의해야 함
android:id : 요소에 유일한 아이드를 할당. 이 아이디를 이용해서 Java파일에서 해당 요소를 참조할 수 있음
android:layout_width & height : 요소의 폭과 너비.
- match_parent : 부모 화면만큼 크기를 차지
- wrap_content : 콘텐츠를 표시할 정도만 차지
android:text : 화면에 표시하는 텍스트 설정
(속성 앞의 android는 "android" 이름 공간에 선언된 속성이라는 것 의미)
- 아이콘 리소스
res -> drawable -> ic_launcher.png
각 해상도 별로 따로 저장
ic_launcher_background.xml : 아이콘의 배경
ic_launcher_foreground.xml : 아이콘
- 문자열 리소스
문자열도 리소스로 정의하기를 권장 -> 앱을 여러가지 언어로 배포하기 쉬워지기 때문
리소스로 정의하면 나중에 변경하기도 쉬움
res -> values -> strings.xml
<string> 태그 안에 "name" 속성을 지정하고 텍스트 내용을 지정하고 태그를 닫아줌
<string name="hello">Hello World!</string>
-> activity_mian.xml 파일에서 android:text 속성을 지정할 때 "name" 속성을 이용해서 다음과 같이 적용 가능
android:text="@string/hello"
- 리소스와 소스코드의 연결
레이아웃 리소스의 ID를 이용해서 연결
안드로이드 스튜디오는 res 폴더 아래의 리소스들을 분석해서 각각 겹치지 않는 식별자를 하나씩 부여 -> R.java 파일에 모여있음
R.java파일에는 R 클래스가 정의되어 있고 R 클래스 안에는 각 리소스의 타입별로 내부 클래스를 작성해서 각 리소스를 정적 상수의 형태로 저장
=> R 클래스 안에 attr, dimen, drawable, id, layout, menu, string 클래스를 정의하고 그 안에 정수 상수 형태로 리소스들에 ID를 부여
해당 리소스를 참조하려면 'R.layout.activity_main' 과 같은 방식으로 클래스의 맴버를 참조
* 새 액티비티 생성하기
New Project -> No Activity로 프로젝트 생성
패키지 폴더 -> new -> Activity -> Empty Activity
-> 이름 지정, Launcher Actiivty 체크 (시작 시 실행될 액티비티) -> Create
4) 매니페스트 파일(manifest)
앱에 적제된 모든 컴포넌트에 대하여 기술하는 XML 파일
manifest 폴더 안에 AndroidManifest.xml 파일로 있음
<application> 태그 안에 <activity> 태그로 구성되어 있음
(앱을 구성하는 컴포넌트의 종류와 개수에 따라 달라짐)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="kr.co.company.test">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Test">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<manifest> ... </manifest> : 앱 안에 적재된 목록을 시작. 속성으로 패키지 이름, 버전 코드, 버전 이름 등이 선언됨
<application> ... </application> : <manifest> 태그 안에 존재. 아이콘, 레이블 등이 속성으로 선언됨. 해당 앱이 가지고 있는 컴포넌트에 대하여 알림
<activity> ... </activity> : 앱이 가지고 있는 컴포넌트 요소(다른 종류의 컴포넌트를 가지고 있다면 해당 컴포넌트 태그도 존재) 속성으로 이름, 레이블이 선언되어있음
<intent-filter> ... </intent-filter> : 액티비티로 들어오는 인텐트를 걸러냄. 어떤 인텐트를 허용할 것인지를 기술
인텐트는 액티비티와 액티비티 사이을 연결해주는 메커니즘
<category android:name="android.intent.category.LAUNCHER" />는 해당 액티비티를 앱을 시작했을 때 시작점으로 지정한다는 의미
4. 로그캣
안드로이드 스튜디오의 하단을 보면 Logcat 탭이 있음
앱이 실행되면서 출력하는 메시지들을 볼 수 있음
오류가 발생하면 로그캣을 주의깊게 살펴봐서 오류에 대한 원인을 파악해야 함
앱 실행 도중 트정 값을 콘솔에 출력하고자 하는 경우 로그캣 이용
Log.v([태그], [메시지]);
(태그는 Logcat 탭에서 로그들을 필터링할 때 사용
* 예시
Log.v("my_Log", "This is App");
* Logcat 탭에서 확인한 로그. 태그를 검색해서 내가 작성한 로그를 확인할 수 있음





댓글
댓글 쓰기