component
이다Component란 Android 앱뿐만 아니라 여러 Application을 개발할 때 사용하는 개념이다. Component를 정의하자면 Application의 구성요소이다. 즉, 하나의 Application은 여러 개의 Component로 구성되어 있다. Android에서는 클래스로 컴포넌트를 개발한다. 즉, 하나의 클래스가 하나의 Component가 된다
위의 내용을 정리해보면 다음과 같다.
위에서 안드로이드에서는 클래스로 컴포넌트를 개발한다고 했지만 Application을 구성하는 모든 클래스가 Componet라는 이야기는 아니다.
Application은 여러개의 클래스로 구성되는데 클래스는 크게 Component 클래스와 일반 클래스로 구분한다.
Component 클래스와 일반 클래스 둘 다 개발자가 만드는 클래스이다. 하지만 런타임(Runtime) 때 생명주기(lifecycle)을 누가 관리하는가
에 따라 차이가 존재한다.
: 런타입(Runtime) 때 클래스의 객체 생성 ~ 소멸까지의 생명주기 관리를 개발자 코드
에서 한다. 즉, Android 앱의 구성요소인 Component가 아닌 개발자가 임의의 목적
으로 만든 클래스이다.
: 런타임(Runtime) 때 클래스의 객체 생성 ~ 소멸까지의의 생명주기 관리를 안드로이드 시스템
에서 관리한다.
Component는 Activity
, Service
, Contents Provider
, Broadcaast Reveiver
이렇게 4가지로 구분한다. 이 Component들은 어플이 실행될 때 각각 다른 기능을 수행한다.
Activity는 화면을 구성하는 Component로 앱의 화면을 안드로이드 폰에 출력을 하기 위해서는 Activity를 만들어야 한다. 어플이 실행되면 Activity에서 출력한 내용이 안드로이드 폰에 나온다.
Service는 백그라운드(Background) 작업을 하는 Component이다. 화면 출력 기능이 없으므로 Service가 실행되더라도 화면에는 출력되지 않는다. Service Component는 화면과 상관없이 백그라운드에서 장시간 실행해야 할 업무를 담당한다.
Contents Provider는 앱의 데이터를 공유하는 Component이다. 안드로이드 폰에는 많은 앱이 설치되어 있으며 앱 간에 데이터를 공유
할 수도 있다.
한 개의 앱이 자신의 데이터를 다른 앱에 공유하려면 Contents Provider를 만들어야 하며, 다른 앱에서는 그 Contents Provider를 이용해 데이터에 접근한다
예를들어, 카카오톡 앱에서 프로필을 변경할 때 갤러리 앱의 사진을 이용할 수 있다. 이때, Contents Provider를 이용해 데이터를 주고받는다.
시스템 이벤트가 발생할 때 실행되게 하는 Component이다. 여기서 이벤트는 화면에서 발생하는 사용자 이벤트가 아닌 시스템에서 발생하는 특정 상황
을 의미한다. 예를 들어 부팅완료, 배터리 방전 같은 상황을 의미한다.
Component는 앱이 실행될 때 안드로이드 시스템에서 생명주기를 관리하는 클래스이지만 개발자가 만들어야 하는 클래스이다. 개발자가 Component 클래스를 만들 때에는 지정된 클래스를 상속받아야 하는데 이 상속받는 상위 클래스를 보고 구분할 수 있다.
Component는 개발자가 만들고자 하는 앱의 기능과 화면 등을 고려해 필요한 만큼 구성하면 된다.
앱을 만들 때 어떤 Component를 어떻게 구성할 지는
설계에 따라 달라지며 정해진 규칙은 없다
심지어 ACtivity가 없는 어플 그래서 사용자에게 보여지는 화면을 제공하지 않는 앱도 개발할 수 있다.
Componet는 Application 안에서 독립된 실행 단위
라는 중요한 특징이 존재한다.
독립된 실행단위
란 Component끼리 서로 종속되지 않아서 코드 결합이 발생하지 않는다는 의미
예를 들어, Activity1과 Activity2가 존재한다고 했을 때, Activity1 -> Activity2로 이동을 해야 한다고 가정하자. 단순하게 생각하면 Activity1에서 Activity2를 실행하는 코드를 작성하면 될 것 같기도 하다. 즉, 두 클래스를 결합하여 실행하는 방법(직접 실행)을 하면 될 것 같지만 결론부터 말하면 이 방식은 Android에서는 불가능하다.
Component의 생명주기를 Android System에서 관리하기 때문에 코드에서 직접 객체를 생성해 실행할 수 없기 때문
Activity1에서 Activity2를 실행해야 한다면 Android System
에 의뢰해서 시스템이 Activity2를 실행하도록 해야한다.
Android System에 의뢰함으로써 두 클래스가 서로 종속되지 않고 독립해서 실행되게 해야한다.
Component는 방금 위에서 설명한 앱 내에서 독립해서 실행되는 특징 덕분에 앱의 실행 시점이 다양
할 수 있다. 예를 들어 앱의 첫 화면이 Activity1인 경우 Activity1부터 실행되어 화면이 출력된다. 하지만 앱은 사용자가 직접 실행하지 않은 경우에도 얼마든지 실행될 수 있다. 카카오톡에서 사용자가 알림 창에서 메시지 수신 알림을 터치하면 바로 채팅화면이 출력된다. 즉, Activity1부터 앱이 실행되지 않고 바로 Activity2가 실행되는 구조이다.
그래서 안드로이드 앱에서는 메인 함수(main function) 개념이 없다고 말한다.
다른 애플리케이션을 라이브러리처럼 이용하는 것
카카오톡의 경우, 채팅화면에서 카메라 앱을 실행하여 사진을 찍은 뒤 사진 데이터를 반환받아 다시 채팅화면에 출력할 수 있다. 이때 카카오톡 앱에서 카메라 앱을 이용해 사진을 찍었으므로 카카오톡 앱이 카메라 앱을 라이브러리처럼 이요한 것이다.
이처러 안드로이드 앱은 사용자가 실행하지 않아도 실행될 수 있고, 실행 시점도 다양해서 다른 앱과 연동할 수 있다.
안드로이드 앱 개발의 또 다른 특징은 리소스를 많이 활용한다는 점이다.
코드에서 정적인 값을 분리한 것
사용자 이벤트에 따른 동적인 값이 아닌 항상 똑같은 값이라면 굳이 코드에 담지 않고 분리해서 개발하는 것이다. 이렇게 할 경우 코드가 짧아져서 개발 생산성
과 유지·보수성
이 좋아진다.
예를들어, 안드로이드에서 문자열을 사용한다고 가정할 경우 이렇게 작성할 수 있다.
Kotlin 파일
textView.text = """
동해 물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려 강산
대한 사람, 대한으로 길이 보전하세
"""
res/values/strings.xml파일
<string name ="myText">
동해 물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려 강산
대한 사람, 대한으로 길이 보전하세
</string>
Kotlin 파일
textView.text = resurces.getString(R.string.myText)
안드로이드 앱을 개발할 때는 많은 요소를 리소스로 등록해서 사용한다.
문자열 이외에도 색상, 크기, 레이아웃, 이미지, 메뉴 등 많은 요소를 리소스로 활용한다.