안드로이드/이론관련

안드로이드 4대 컴포넌트(구성요소)

닉네임못짓는사람 2023. 2. 27. 20:04
반응형

이 글에선 안드로이드의 4대 컴포넌트에 대해서 알아보도록 하자.

 

안드로이드는 4개의 컴포넌트(구성요소)로 이루어져 있다.

1. Activity(액티비티)
2. Service(서비스)

3. BroadcastReceiver(방송 수신자)

4. ContentProvider(콘텐츠 제공자)

이 네 가지 컴포넌트들은 각각 독립적인 형태로 존재하며, 고유의 기능을 수행한다.

또한 넷은 Intent를 통해서 서로 상호작용을 하는데, 그림으로 표현하면 아래와 같이 된다.

그렇다면 네 가지 놈들의 특징에 대해 알아보기 전에 Intent라는 놈은 뭔데 넷의 사이에서 존재할까?

Intent의 가장 간단한 사용 예는 화면(Activity)전환에서 볼 수 있다.

 

먼저, 우리가 Activity이동을 할 때에는 먼저 Intent객체를 생성해주는데, 이때 다음 Activity의 정보를 넣어준다.

val intent = Intent(context, NextAcitivty::class.java)
startActivity(intent)

 

이러한 방식은 명시적 인텐트(Explicit Intent)라고 한다.

 

또한 우리가 안드로이드 앱을 개발하면서 화면을 전환할 때 값을 가장 쉽게 전달할 수 있는 방법은

Intent에 우리가 원하는 값과 키워드를 put해서 이를 다른 Acitivity에서 get하는 방법이다.

 

이때 우리는 넘어간 Activity에서 getIntent메소드를 사용함으로써 이 값이 들어있는 intent를 받을 수 있다.

즉, Intent는 컴포넌트 A가 컴포넌트 B를 호출할 때 필요한 정보들을 담고 있는 통신장치라고 볼 수 있다.

 

이런 Intent는 다시 두 가지 종류로 구분되는데 첫 번째는 위에서 말한 명시적 인텐트,

두 번째는 암시적 인텐트(Implicit Intent)이다.

 

프로그래밍을 하다 보면 명시적, 암시적이라는 단어를 여러 번 들어보았을 텐데,

암시적 형변환, 명시적 형변환 같은 단어들을 들어보았을 것이다.

이 둘은 형변환시 자료형을 지정해주느냐, 지정해주지 않고 자동적으로 형변환을 하느냐의 차이가 있다.

 

Intent의 경우도 명시적 인텐트는 Intent에 컴포넌트 이름을 `명시적`으로 지정하여

호출될 대상을 확실히 알 수 있는 경우를 말한다.

 

하지만 암시적 인텐트는 이러한 명확한 대상을 지정해주지 않고, Intent에 포함된 정보를 기반으로

이를 받을 대상을 시스템에서 찾아서 Intent를 전달해주는 방식을 의미한다.

이는 현재 이 코드가 실행되는 앱 안에서만 찾는 게 아니고 디바이스에 설치된 모든 응용프로그램을 검사한다.

 

자 이렇게 Intent가 뭔지에 대해 간략하게 알아봤으니 다시 본론으로 돌아가서 4대 컴포넌트에 대해서 자세히 들어가 보자.


1. Acitivty(액티비티)

Acitivity는 사용자가 Application과 상호작용하는, 실제로 사용자에게 보이는 화면을 의미한다.

우리가 Application을 사용하면서 보는 화면 하나하나가 이 Acitivity가 된다는 말이다.

 

때문에 Application는 하나 이상의 Activity를 가지고 있는데, Application에 화면이 하나도 없으면

사용자랑 상호작용을 할 수 없으니 Application에는 적어도 하나의 Activity는 꼭 있어야 할 것이다.

때문에 우리가 Android Studio에서 프로젝트를 처음 생성하면 가장 먼저 MainActivity가 생성된다.

 

이런 Activity는 한 번에 두 개를 동시에 Display할 수는 없다.

대신 Fragment(프래그먼트)라는 것을 활용해서 화면을 분할시켜서 보여줄 수는 있다.

또한 Activity는 내가 사용 중인 Application 뿐만 아니라 다른 Application의 화면도 호출할 수 있다.

 

마지막으로, Activity는 하나 이상의 View 또는 ViewGroup을 가지고 있어야 한다.

여기서 View는 화면에서 우리 눈에 보이는 모든 것, 예를 들어 버튼, 이미지... View Group은 레이아웃이 예라고 볼 수 있다.

 

비유를 해보자면, 종이를 끼우는 파일철을 생각해보도록 하자.

파일철에는 여러 장의 종이를 끼워서 보관할 수 있는데, 우리는 한 번에 한 종이의 한 면만 확인할 수 있다.

여기서 이 한 면이 Activity가 되는것이고, 한 면 위에 쓰여진 내용들을 View또는 ViewGroup이라고 할 수 있다.


2. Service(서비스)

Service는 백그라운드에서 실행되는 프로세스를 의미한다.

Activity가 우리 눈에 보이는 화면에서 상호작용을 하는 것과는 다르게

Service는 화면을 가지지 않고 우리 눈에 보이지 않는 곳에서 작업을 수행하도록 되어있다.

 

만보기 App같은 경우를 생각하면 우리가 App을 다운로드하여서 Activity에서 설정이나 걸은 거리, 걸음 수 같은걸

볼 수는 있지만, 실제로 우리가 화면을 끄고 걸어 다녀도 만보기에선 걸음 수를 계속해서 측정한다.

이런 경우가 바로 백그라운드 동작 즉, Service에 해당한다고 볼 수 있다.

 

뮤직 플레이어 같은 경우도 백그라운드에서 계속해서 음악을 재생하기 때문에 이 기능은 Service에 속한다고 볼 수 있다.

그러려면 당연히 Service가 시작되면 우리가 화면에 띄워놓지 않아도(App을 종료해도)돌아갈 수 있어야 할 것이다.


3. BroadcastReceiver(방송 수신자)

BroadcastReceiver는 안드로이드에서 각종 이벤트와 정보를 받아와 반응하여 처리하는 컴포넌트이다.

 

대부분 UI를 가지지 않으며, 수신기를 통해 디바이스의 상황을 감시하다가 이벤트가 발생하면

해당 이벤트에 맞게 정의해둔 작업들을 수행하는 역할을 한다.

예를 들면 화면이 꺼지고 켜진다거나, 네트워크 접속이 끊어진다거나 하는 이벤트 정보를 수신한다.

 

또한 중요한 점은 BroadcastReceiver는 안드로이드 앱 하나에서 동작하는 것이 아니고

안드로이드 시스템 전체에서 동작한다는 부분일 것이다.

 

Broadcast(방송)이라는 말 그대로 안드로이드 시스템에서는 이벤트가 발생하면 해당 이벤트에 대한 정보를

기기 내의 모든 Applicaton에 Broadcast한다. Application들은 이 메시지를 받아서 처리할 수 있는

BroadcastRecevier가 있다면 해당 작업을 수행할 수 있다.

 

또한 하나의 Application에서 Broadcast하여 다른 Application에 동작을 수행하도록 할 수도 있다.

간단하게 예를 들자면 외국인과 한국인이 섞여있는 한 방이 있을 때 이 방을 Android기기,

각각의 사람들을 Application이라고 해보자.

 

어떤 한 사람이 이 방에 들어와 한국어로 불이야!라고 외치면(Broadcast하면) 한국인들은 

한국어 패치(BroadcastReceiver)가 되어있기 때문에 이를 알아먹고 황급히 도망을 칠 것이다.

반면 외국인들은 불이야!라는 말을 알아듣지 못하니(BroadcastReceiver가 없다) 무슨 상황인지 제대로 인지를 못한다.

 

BroadcastReceiver는 보통 action이라는 걸 통해서 각각의 이벤트를 구별하는데, 위 예에서는

`불이야!`가 action이 될 것이고 이 action에 대응할 수 있는 BroadcastRecevier를 가진 Application(사람들)만 도망을 칠 수 있을 것이다.

 

반대로 방에 들어온 사람이 आग!라고말하면 한국인들은 뭐라는거야? 라고 반응하지않을까?

참고로 आग!는 힌디어로 불이야!라는 뜻이다.

 

뭐, 실제로는 눈치껏 다들 도망가겠지만..


4. ContentProvider(콘텐츠 제공자)

콘텐트 제공자는 데이터를 관리하고, 다른 Apllcation 데이터를 제공해주는 컴포넌트이다.

쉽게 말하면 데이터를 저장하고, 불러와서 사용할 수 있는 시스템들을 말한다.(DB, 웹, 파일 시스템 등등...)

 

이러한 데이터들은 ContentProvider가 허용하면 가져오는 것뿐만 아니라 수정도 할 수 있다.

DB의 경우 Android에서 자체적으로 사용되는 DB는 SQLite라는 것이 있는데, 사실 필자는 써본 적은 없다.

 

Android는 이 ContentProvider를 통해서 다른 Application끼리 데이터를 공유하여 사용할 수가 있는 것이다.

어떤 사람은 ContentProvider가 Server와 비슷한 역할을 한다고도 한다더라.

 

예를 들면 `연락처`가 이렇게 ContentProvider를 통해서 공유해야 할 데이터가 된다고 볼 수 있을 것이다.

연락처는 기기에 저장(요즘은 Google계정에 연락처 정보가 저장되더라)되지만 카카오톡을 들어가 보면

우리가 기기에 저장한 연락처와 동기화를 할 수 있는 걸 볼 수 있다.

이런 경우가 바로 ContentProvider를 통해 카카오톡이 우리의 연락처에 대한 `데이터` 공유받아서 사용한 것이다.

 

당연히 이런 ContentProvider를 사용하려면 권한을 획득해야 한다.

누군가가 내 허락도 없이 내 연락처 또는 정보들을 마음대로 가져다가 쓰면 안 될 거 아닌가?

 

이러한 부분의 보안적인 이슈들 때문에 카카오톡 같은 Application을 처음 설치하면

우리가 당신의 연락처(전화번호부)에 접근을 해서 데이터를 써도 되겠습니까?라고 물어보는 것이다.


이렇게 이번 글에서는 안드로이드 4대 컴포넌트에 대해서 알아보았다.

글을 보시는 모든 분들에게 도움이 되었으면 좋겠습니다.

반응형