면접 코칭을 받고 여러가지 지식들보다 우선적으로 안드로이드에 관한 지식들을 먼저 알아야겠다는 생각이 많이 들었다. 안드로이드의 기본적인 부분부터 차근차근 채워봐야겠다.
컴포넌트란 여러가지 애플리케이션을 개발할때 사용하는 개념으로 애플리케이션을 구성하는 하나의 단위를 말한다. 즉, 하나의 애플리케이션은 단일 혹은 여러개의 컴포넌트로 구성된다.
안드로이드 애플리케이션 역시 컴포넌트로 구성되어 있으며, 각각의 컴포넌트들은 클래스를 사용해 구성된다.
안드로이드의 애플리케이션은 여러가지의 클래스로 구성되어 있는데, 해당 클래스들은 앞서 말한 컴포넌트 클래스와 일반 클래스로 나뉘게된다.
안드로이드 애플리케이션을 구성하는 모든 클래스들은 개발자가 생성하지만 생명주기 관리를 누가 하느냐에 따라 컴포넌트 클래스와 일반 클래스로 나뉘게 된다.
앱이 실행되고 있는 런타임때 클래스 객체의 생성부터 소멸까지의 생명주기를 개발자가 직접 코드 내부에서 관리한다면 일반 클래스, 개발자가 클래스를 만들긴 했지만 해당 클래스로 생성한 객체의 생명주기를 안드로이드 시스템에서 관리한다면 컴포넌트 클래스라고 한다.
안드로이드 애플리케이션에서 화면을 구성하기위해 사용하는 Fragment라는 클래스가 있다. 하지만 이 Fragment는 사용자가 직접 생명주기를 관리하지는 않는데, 그렇다면 Fragment는 컴포넌트 클래스인가?
Fragment는 컴포넌트 클래스가 아니다. Fragment는 컴포넌트의 하나인 Activity에 종속된 구성요소로, Fragment의 생명주기는 종속된 Activity를 통해서 관리된다.
즉 Fragment의 생명주기는 시스템에의해서 관리되기는 하지만 Activity를 통한 간접적인 관리이며, Fragmet는 Activity없이 단독으로 사용할 수 가 없기 때문에 앱을 직접적으로 구성하고 있는 컴포넌트라고 할 수 는 없다.
안드로이드의 컴포넌트를 흔히 4대 컴포넌트라고 하는데, 이는 여러가지 컴포넌트들 중에서 중요한 4가지를 의미하는 것이 아니다.
안드로이드의 컴포넌트는 앞서 말했듯 안드로이드 애플리케이션을 구성하는 구성요소로 컴포넌트의 종류는 총 4가지이다. 그렇기 때문에 안드로이드의 4대 컴포넌트라고 부르는듯 하다.
각각의 컴포넌트들을 간단하게 살펴보면 다음과 같다.
화면을 구성하는 컴포넌트로 앱을 실행하면 Activity에서 출력한 내용이 화면에 나타난다.
백그라운드 작업을 위한 컴포넌트다. 화면에 출력되지 않는 컴포넌트로 화면과 상관없이 백그라운드에서 실행되어야하는 작업들을 담당한다.
앱간의 데이를 공유하기 위해 사용하는 컴포넌트. 어느 앱이 다른 앱에 데이터를 공유하려면 Content Provider를 만들어야 하며, 다른 앱에서는 해당 앱의 Content Provider를 사용해 데이터에 접근할 수 있다.
안드로이드에서 다수의 컴포넌트나 앱에 메시지를 전송하는 방식을 Broadcast라고 하는데, Broadcast는 시스템 이벤트가 발생했을때나, 개발자가 앱에서 직접 정의했을때 전송된다.
Broadcast Reciver는 이러한 Broadcast메시지를 수신하는 컴포넌트로 시스템 이벤트나 다른 앱에서 발생한 이벤트를 수신해 특정 이벤트에 대해 원하는 동작을 실행하도록 하는 컴포넌트이다.
그럼 어떤 클래스가 컴포넌트 클래스인지, 일반 클래스인지 구분할 수 있을까?
기본적으로 컴포넌트 클래스를 생성하려면 지정된 클래스를 상속받아서 만들어야한다. 예를들어 Activity 컴포넌트클래스를 만들려면 Activity라는 클래스를 상속해서 만들어야하는데 이처럼 상속받는 상위 클래스를 보고 해당 클래스가 컴포넌트 클래스인지 아니면 일반 클래스인지 구분하는게 가능하다.
안드로이드의 컴포넌트 클래스들은 반드시 Activity, Service, ContentProvider, BroadcatReciver중 하나의 클래스를 상속받는다.
기본적으로 안드로이드 앱의 컴포넌트는 개발자의 의도에 따라 결정된다. 반드시 모든 컴포넌트를 사용할 필요는 없으며, 앱의 기능이나 화면에 따라 원하는 대로 구성해서 사용하면 된다.
컴포넌트의 가장 큰 특징중 하나는 각각의 컴포넌트들이 앱 내부에서 실행되는 독립적인 단위라는 것인데 즉, 각각의 컴포넌트들은 다른 컴포넌트와 코드결합이 없기때문에 종속되어있지 않아 각자 독립적으로 실행이 가능하다는 것이다.
예를들어 어느 한 컴포넌트 클래스에서 다른 컴포넌트 클래스를 실행시킬 경우 직접적으로 한 클래스에서 다른 클래스 객체를 생성해 직접적으로 결합하는 방식으로 실행되는 것이 아니다.
컴포넌트 클래스의 생명주기는 시스템에서 관리하기 떄문에 코드 내부에서 직접 객체를 생성하지 않으며 시스템에 요청을 통해 다른 컴포넌트 클래스를 실행하는 방식으로 전환되게된다.
이러한 방법을 통해 두 클래스가 서로에게 종속되지 않고 독립되게 실행되게 된다.
이러한 특징 덕분에 안드로이드는 앱실행시 진입 시점을 다양하게 설정할 수 있게된다.
또한 안드로이드는 애플리케이션 라이브러리를 사용하는게 가능한데, 애플리케이션 라이브러리란 안드로이드의 다른 애플리케이션을 라이브러리처럼 이용할 수 있다는 것을 말한다.
즉, 사용자가 다른 앱을 직접 실행하지 않아도 앱을 실행할 수 있으며, 실행 시점역시 다양해서 개발자가 원하는 대로 다른 앱과의 연동을 설정할 수 있다.