記錄

기초 본문

Mobile/Android

기초

surhommejk 2018. 1. 10. 18:23

- 파편화 vs 개방성

운영체제의 소스 코드, 라이브러리 코드 등이 모두 공개되어 있으므로 이를 사용해 각 스마트폰 제조사들이 조금씩 변경을 하기 때문에 파편화가 이뤄지는 단점이 있다. 그만큼 개방되어 있다는 것이기도 하다.



- iOS와 다른점

iOS는 특정 9개 앱의 기능을 운영체제가 책임져 주는 것이지 실제로 둘 이상의 앱이 동시에 돌아가지는 않는다. 이런 의미에서 안드로이드는 멀티태스킹을 지원하고 iOS는 그렇지 않다고 할 수 있다.



- ART(Android Runtime)

일반적으로 .java는 java파일을 .class파일로 컴파일하고 이를 JVM에서 돌렸었다. 안드로이드는 .java를 .class로 컴파일 하는 것은 동일하지만 .class를 다시 .dex 파일로 컴파일 한 후 이를 ART상에서 돌린다는 점에서 기존의 java 프로세스와 다르다.



- 컴포넌트

안드로이드 어플리케이션(앱)은 컴포넌트들이 모여 이뤄진다. 즉, "앱 = 컴포넌트들의 조합"이라고 할 수 있다. 그리고 컴포넌트는 물리적으로는 class파일로 나타난다. 1컴포넌트당 1클래스라는 뜻이다. 하지만 모든 클래스가 컴포넌트라고 할 수는 없다. 클래스에는 일반 클래스와 컴포넌트 클래스, 이렇게 두 종류가 있다. 이는 클래스의 생명주기 관리 주체가 무엇인지에 따라 나뉜다. 클래스의 생명주기를 관리자가 직접 new로 생성하고 null로 소멸한다면 이는 일반 클래스이다. 반대로 생명주기를 안드로이드 시스템이 관리한다면 이는 컴포넌트 클래스라고 할 수 있다.



- 컴포넌트의 독립성에서 기인한 특성 세 가지


1. 컴포넌트간 직접 결합이 불가능하다

컴포넌트는 느슨한 결합도에 의해 독립적으로 작용한다. a와 b 두 클래스가 있다고 가정할 때 기존의 자바에서는 한 클래스에서 다른 클래스를 new 연산자를 통해 만들고 사용하면 되었었다. 하지만 안드로이드에서는 컴포넌트들의 독립성으로 인해서 그런 식으로 만들어 사용할 수 없다. intent를 매개로 하여 결합하지 않고 독립적으로 실행하여야 한다. 사용하고자 하는 클래스를 시스템에 의뢰하여 사용하여야 한다는 것이다.


2. 진입지점이 없다

기존에 java의 main 함수와 같은 진입 지점이 존재하지 않는다. 모든 컴포넌트가 진입 지점으로 작동될 수 있다. 가령 SMS app에서는 발신 기능의 컴포넌트가 진입지점이 될 수 있는데 문자가 도착할 경우에는 수신 기능의 컴포넌트가 진입 지점이 될 수 있는 것이다. 이것도 결국 컴포넌트의 독립성 덕분이라고 볼 수 있다.


3. "애플리케이션 라이브러리"라는 개념이 존재한다

가령 SMS app 에서 사진을 첨부하고 싶을때, 단지 갤러리 app을 연동시켜 놓고 SMS app 사용 중 갤러리 app을 실행시키도록 하면 된다. 즉, SMS app내에 갤러리 app을 구현하는 것이 아니라 다른 컴포넌트를 그냥 실행시키기만 하면 되는 것이다. 앱 자체를 라이브러리로 사용하는 것이다. 이를 두고 "애플리케이션 라이브러리"라고 할 수 있는 것이다. 더 나아가서 앱과 앱의 연동도 용이해진다. 외부 앱에서 필요한 컴포넌트만 뽑아서 앱 자체를 실행하지 않고 타겟 컴포넌트의 기능만 실행할 수 있기 때문이다.



- 컴포넌트 종류 4가지


액티비티(Activity)

UI를 구성하기 위한 컴포넌트로 사용자 화면을 제공하는 컴포넌트


서비스(Service)

 화면과 전혀 상관없고 눈에 보이지도 않음. 백단이라고 보면 됨. 예를 들어 채팅앱이 있다고 한다면 사용자가 채팅앱을 사용하지 않아도 계속 서버에 연결되어서 데이터를 수신해야하는데 이럴때 서비스 컴포넌트가 사용됨


콘텐츠 프로바이더(ContentsProvider)

앱 간의 데이터 공유 목적으로 사용하는 컴포넌트. 가령 주소록 데이터를 뽑아와서 친구 추가로 써먹어야 한다면 콘텐츠 프로바이더 컴포넌트를 통해  주소록 앱에서 데이터를 받아 온다.


브로드캐스트 리시버(BroadcastReceiver)

이벤트 모델로 수행되는 컴포넌트



- R.java의 기능

리소스를 추가할 때 각 폴더의 폴더명을 바꿀 수도 없고 하위 폴더를 만들 수도 없다. 이유는 R.java의 존재와 기능 때문이다. 각 리소스가 추가될 때마다 R.java에는 static int값이 들어가게 되는데 이를 통해 관리가 조금 더 용이해진다.







AndroideManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kimjungkwon.test1"> // gradle에 설정된 applicationId값과 같음
<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/AppTheme">
// 앱의 구성요소를 등록하기 위한 태그

<activity android:name=".MainActivity"> // 앱에 엑티비티 컴포넌트를 등록하기 위한 태그
<intent-filter> // 앱 아이콘 실행시 실행되는 액티비티 설정
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>




MainActivity.java

package com.kimjungkwon.test1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
//AppCompatActivity는 Activity의 서브 클래스이고 후에 자세히 공부

protected void onCreate(Bundle savedInstanceState) {
// 액티비티 실행시 자동으로 onCreate() 실행된다

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//res/layout/activity_main.xml을 setContentView()로 출력
}
}




activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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="com.kimjungkwon.test1.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" />

</android.support.constraint.ConstraintLayout>



Comments