이 글은 깡쌤의 안드로이드 프로그래밍을 보며 작성하였습니다
안드로이드 앱의 아키텍처에서 가장 큰 특징은 컴포넌트 기반이라는 것입니다.
컴포넌트는 앱의 구성단위입니다. 즉 안드로이드 앱을 작성한다는 건 컴포넌트를 작성한다는 것입니다. 안드로이드 앱에서 컴포넌트의 물리적인 모습은 클래스입니다. 이때, 모든 클래스가 컴포넌트가 아니고 일반 클래스와 컴포넌트로 나뉘는데 이 둘의 차이는 클래스의 생명주기를 누가 관리하는지에 있습니다
왜 굳이 컴포넌트라 하면 컴포넌트 클래스는 독립적인 수행 단위로 동작하기 떄문입니다. 독립적인 수행단위로 동작한다는 의미는 '느슨한 결합도'와 관련이 있습니다
예를 들어, A 클래스에서 B클래스를 실행하려면 아래와 같이 생성해서 실행하는데 이는 A 클래스가 B 클래스에 직접 결합되었다고 표현합니다.
class A {
val b1 = B()
}
class B {
}
하지만 실행하고자 하는 B 클래스가 안드로이드 컴포넌트 클래스라면, 개발자 코드로 생성해서 실행하는 구조가 아닌 인텐트(Intent)라는 것을 매개로 하여 결합하지 않은 상태에서 독립적으로 실행하는 구조입니다.
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
}
}
이 구조에서 중요한 역할을 하는 것이 시스템인데, A 컴포넌트는 B 컴포넌트 실행을 시스템에 의뢰하고 시스템에서 B 컴포넌트를 실행하는 것입니다. 따라서 서로 직접 결합이 발생하지 않는 구조입니다.
안드로이드에는 앱의 프로세스가 구성되어 최초로 실행되는 main 함수라고 부르는 개념이 없어서 앱의 수행 시점이 다양할 수 있습니다. 즉, 컴포넌트 클래스들은 모든 프로세스가 구동되었을 때 최초로 실행되는 수행 시점이 될 수 있습니다.
예를 들어, SMS 앱을 생각하면 사용자가 실행하지 않아서 앱의 프로세스가 구동되지 않은 상태에서도 SMS가 전달되면 SMS 수신 기능을 하는 컴포넌트로부터 실행되어 프로세스가 구동될 수 있습니다.
이처럼 앱의 수행 시점은 다양할 수 있으며, 이런 이유로 main 함수가 없다고 표현합니다. 이 모든게 안드로이드 컴포넌트가 앱 내에서 각각 독립적인 단위로 수행될 수 있기 때문입니다.
SMS 앱에서 상대방에게 이미지를 보내기 위해 갤러리 앱을 실행해 이미지를 선택하고 사진을 보내
는 예가 있습니다. 여기서 갤러리앱과 SMS 앱이 클래스로 직접 결합해서 실행되면 갤러리앱은 SMS앱의 클래스가 아니여서 코드를 실행할 수 없습니다. 하지만 안드로이드 컴포넌트는 인텐트를 통해 다른 컴포넌트를 실행시키므로 개발자 코드의 결합이 발생하지 않아서 외부 앱의 컴포넌트도 실행시킬 수 있습니다.
이처럼 내가 구현하지 않았는데 내가 구한한 것처럼 활용할 수 있어서 개발자 관점에서는 다른 앱들을 라이브러리로 생각할 수 있습니다. 이 개념 또한 안드로이드가 컴포넌트 기반이라서 가능합니다.
안드로이드 컴포넌트 종류
그렇다면 어떤 컴포넌트를 이용해서 앱을 개발해야 하나요?
이는 개발자가 앱의 업무와 화면 설계에 따라 적절하게 컴포넌트를 결정하여 앱을 개발해야 합니다. 즉, 앱에 최적화된 컴포넌트를 도출하는 게 앱의 효율성 측면에서 굉장히 중요합니다