2_안드로이드 이해
| topics | 500-모바일개발 502 Android |
| types | 이론 학습 |
| tags | |
| references | developer.android.com/guide/topics/re... |
Android 아키텍처
Android 시스템의 구조와 핵심 개념을 정리한다.
시스템 구조

| 계층 | 설명 |
|---|---|
| Linux Kernel | 리눅스 기반 운영체제 |
| HAL | 하드웨어 추상화 레이어 - Java API에서 하드웨어 기능 접근 가능하게 함 |
| ART | Android Runtime - 앱 실행 담당 |
| Java API Framework | 앱 개발용 API |
| Applications | 실제 앱들 |
컴파일 과정

일반 Java vs Android Java 컴파일 비교:
| 단계 | 일반 Java | Android |
|---|---|---|
| 1 | .java → .class | .java/.kt → .class |
| 2 | JVM에서 실행 | .class → DEX 파일 |
| 3 | - | ART에서 실행 |
왜 DEX 파일로 변환하냐면: Android는 JVM이 아닌 ART(Android Runtime)에서 실행된다. DEX(Dalvik Executable)는 ART가 해석할 수 있는 형식이다.
4대 컴포넌트

Android 앱의 핵심은 컴포넌트다. 컴포넌트는 앱의 구성 요소이자 구성 단위다.
| 컴포넌트 | 클래스 | 역할 |
|---|---|---|
| Activity | Activity |
화면 구성 |
| Service | Service |
백그라운드 작업 |
| Content Provider | ContentProvider |
앱 간 데이터 공유 |
| Broadcast Receiver | BroadcastReceiver |
시스템 이벤트 수신 |
특징: 컴포넌트 클래스와 인스턴스는 1:1 대응이다. 생명주기를 안드로이드 시스템에서 관리한다.
Activity
화면을 구성하는 컴포넌트다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Service
백그라운드에서 실행되는 컴포넌트다. UI가 없다.
class MyService : Service() {
override fun onBind(intent: Intent): IBinder? = null
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// 백그라운드 작업
return START_STICKY
}
}
Content Provider
앱 간 데이터를 공유하는 컴포넌트다. 연락처, 갤러리 등에서 사용한다.
Broadcast Receiver
시스템 이벤트(배터리 부족, 네트워크 변경 등)를 수신하는 컴포넌트다.
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// 이벤트 처리
}
}
리소스 시스템
Android는 정적인 값을 리소스로 등록해서 사용한다.
리소스 접근
// 코드에서 접근
val text = resources.getString(R.string.mytxt)
val color = ContextCompat.getColor(this, R.color.primary)
val drawable = ContextCompat.getDrawable(this, R.drawable.icon)
<!-- XML에서 접근 -->
<TextView
android:text="@string/mytxt"
android:textColor="@color/primary"
android:background="@drawable/icon" />
리소스 파일 명명 규칙

- 실제 파일:
<resource_name>-<qualifier>형식 - Android Studio는 같은 resource_name끼리 그룹화해서 보여줌
- 파일명은 snake_case (대문자 불가)
<!-- res/values/strings.xml -->
<resources>
<string name="app_name">My App</string>
<string name="mytxt">동해 물과 백두산이 마르고 닳도록</string>
</resources>
리소스 사용의 장점
| 장점 | 설명 |
|---|---|
| 유지보수성 | 코드와 데이터 분리 |
| 다국어 지원 | 언어별 리소스 파일 분리 |
| 일관성 | 중앙 집중식 관리 |
| 디자인 변경 용이 | 코드 수정 없이 UI 변경 가능 |
| 메모리 관리 | 시스템이 효율적으로 관리 |
왜 리소스를 쓰냐면: 다국어 지원할 때
values-ko,values-en폴더만 만들면 자동으로 언어에 맞는 리소스를 로드한다. 코드 수정 없이도 가능하다.