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 탭에서 확인한 로그. 태그를 검색해서 내가 작성한 로그를 확인할 수 있음










댓글

이 블로그의 인기 게시물

Spring Boot 6. 계시판 프로젝트

Spring Boot 2. Maria 데이터베이스 & Spring Data JPA

Django 10. DB 연동