Post

Chapter 0. Android 개요

Chapter 0. Android 개요

‘깡샘의 안드로이드 앱 프로그래밍 with 코틀린’ 1 ~ 2장 학습 내용

1절. 프로젝트 생성

초기 화면 설정

ch00-01-startPage

1) Name : 프로젝트 명 2) Package name : 패키지명, 프로젝트 명 - 앱의 식별값 3) Save location : 저장 위치 - 프로젝트의 파일들이 저장되는 루트 디렉토리 4) Language : 사용 언어 - 개발할 안드로이드의 사용 언어 - Kotlin - Java 5) Minimum SDK : 최소 SDK - 앱이 설치되는 최소 SDK 버전 6) Build configuration Language : 빌드 파일 종류 - build.gradle 파일의 타입 선택 부분 - 안드로이드 앱은 Gradle 툴에 의해 빌드 - 오랫동안 사용했던 build.gradle로 생성 가능 - Kotlin 형태인 build.gradle.kits로 생성 가능(권장)

화면 구성

ch00-02-logCat{ width=”70%” }

1) 로그캣(Logcat) - 앱이 실행중일 때 발생하는 로그 출력 - 앱에서 출력한 로그나 오류 메시지 등을 확인할 때 이용

SDK 설정

이름용도설치 여부
Android SDK Build-Tools 34앱 빌드 시 필요 도구필수 설치
Android Emulator앱 실행 시 필요 도구필수 설치
Android ASK Platform-Tools안드로이드 플랫폼과 연동되는 adb, fastboot, systrace와 같은 도구 모음필수 설치
Android Emulator hypervisor driver(installer)AMD용 하이퍼바이저 드라이버AMD CPU일 경우 설치
Intel x86 Emulator Accelerator(HAXM installer)인텔 에뮬레이터 가속기인텔 CPU라면 설치
  • AMD의 하이퍼바이저 드라이버나 인텔의 가속기인 HAXM 설치를 위해서 CPU가 가상화 기술을 지원하고 이를 활성화(BIOS)할 필요 존재

2절. 안드로이드

특징

  • 공개 운영체제 리눅스 기반 개발
  • Kotlin이나 Java 언어를 통한 개발
  • 운영체제의 주요 부분과 라이브러리, 구글에서 만든 앱 등의 코드는 대부분 공개
  • 안드로이드 스마트폰은 구글 뿐만 아니라 여러 제조업체에서 생산 가능
  • 앱은 구글의 플레이 스토어 뿐만 아니라 다양한 방법으로 사용자에게 배포 가능
  • 플랫폼에서는 모든 응용 프로그램이 평등하다는 사상 탑재
  • 모바일에 기본으로 탑재된 앱과 개발자가 만든 앱이 똑같은 환경에서 같은 API 이용

구조

ch00-03-androidStructure{ width=”70%” }

  • 리눅스 커널(Linux Kernel) : 안드로이드는 리눅스에 기반을 둔 오픈소스 소프트웨어 스택
  • 안드로이드 런타임(Android Runtime) : ART라고 불리며 앱 실행 역할
  • 자바 API 프레임워크 : 앱 개발 시 사용하는 자바 API

실행 과정

ch00-04-dex{ width=”60%” }

  • 안드로이드는 자바 클래스를 런타임 때 그대로 실행 X
  • DEX 파일로 컴파일
  • DEX 파일을 해석하는 ARTAndroid Runtime에서 실행

안드로이드 버전

  • 안드로이드 버전 : 13.0, 14.0과 같이 운영체제 버전 의미
  • 앱 개발 시 사용하는 버전 : API 레벨(SDK 버전)
버전코드명API 레벨출시 연도
Android 5.XLollipop21 ~ 222014
Android 6.XMarshmallow232015
Android 7.XNougat24 ~ 252016
Android 8.XOreo26 ~ 272017
Android 9.0Pie282018
Android 10.0-292019
Android 11.0-302020
Android 12.0-312021
Android 13.0Tiramisu332022
Android 14.0UpsideDownCake342023

안드로이드의 컴포넌트

ch00-05-component{ width=”60%” }

  • 컴포넌트는 애플리케이션의 구성 요소
  • 안드로이드 개발 진행 시 클래스로 컴포넌트 개발

컴포넌트 종류

1) Activity(액티비티) : 화면 구성 컴포넌트 2) Service(서비스) : 백그라운드 작업 컴포넌트 3) ContentProvider(콘텐츠 프로바이더) : 앱의 데이터 공유 컴포넌트 4) BroadcastReceiver(브로드캐스트 리시버) : System Event 발생 시 실행 컴포넌트

컴포넌트 구분 방법

  • 개발자가 컴포넌트 클래스 생성 시 지정된 클래스를 상속받음 : 상위 클래스로 구분
  • 종류의 영문으로 된 클래스를 상속

앱 개발의 컴포넌트 특징

1) 앱의 기능, 화면 등을 고려해 필요한 만큼 구성

ch00-07-howComponent{ width=”60%” }

2) 컴포넌트는 앱 안에서 독립된 실행 단위

ch00-08-componentSeparate{ width=”60%” }

  • 컴포넌트끼리 서로 종속되지 않아 코드 결합 발생 X

3) 앱 실행 시점의 다양성

ch00-09-manyView{ width=”60%” }

  • 컴포넌트가 앱 내에서 독립해서 실행되는 특징으로 실행 시점이 다양
  • 안드로이드 앱에는 메인 함수(main function)의 개념이 존재 X

4) 애플리케이션 라이브러리 사용 가능

ch00-10-appLibrary{ width=”60%” }

  • 다른 애플리케이션을 라이브러리처럼 이용 가능

안드로이드 앱의 클래스

ch00-06-classComponent{ width=”60%” }

  • 앱은 컴포넌트 클래스와 일반 클래스로 구분
    • 일반 클래스 : 클래스의 객체 생성 ~ 소멸까지 생명 주기 관리를 개발자 코드에서 진행
    • 컴포넌트 클래스 : 생명 주기를 안드로이드 시스템에서 관리

리소스 활용 개발

  • Resource(리소스) : 코드에서 정적인 값을 분리한 것
  • 문자열 이외에 색상, 크기, 레이아웃, 이미지, 메뉴 등 많은 요소 활용 가능
  • 이미지 등을 제외하면 대부분의 리소스는 XML 파일로 작성
1
2
3
4
5
6
<string name = "mytxt">
    동해 물과 백두산이 마르고 닳도록
    하느님이 보우하사 우리나라 만세!
    무궁화 삼천리 화려 강산
    대한 사람, 대한으로 길이 보전하세
</string>
1
textView.text = resources.getString(R.string.mytxt)

3절. 안드로이드 앱 구성 파일 분석

프로젝트 폴더 구성

ch00-11-projectFolder{ width=”60%” }

  • 프로젝트 폴더 : [모듈명 -> src -> main]

모듈 폴더 구성

이름설명
build.gradle.kts빌드 설정 파일
AndroidManifest.xml앱의 메인 환경 파일
res리소스 폴더
activity_main.xml레이아웃 XML 파일
MainActivity.kt메인 액티비티 파일

1) gradle(그래들) 빌드 설정 파일

  • 안드로이드 앱의 빌드 도구
  • gradle 설정 파일 : build.gradle.kts
    • 프로젝트 수준의 build.gradle.kts(Project : AndroidLab)
    • 모듈 수준의 build.gradle.kts(Module : AndroidLab.app)
// 플러그인 선언
plugins {
    alias(libs.plugins.androidApplication)
    alias(libs.plugins.jetbrainKotlinAndroid)
}
// 앱의 식별자 설정
applicationId = "com.example.androidlab"
  • targetSdk : 개발할 때 적용되는 SDK 버전
  • minSdk : 앱을 설치할 수 있는 기기의 최소 SDK 버전
// SDK 버전 설정
minSdk = 24
targetSdk = 34
// 앱의 버전 설정
versionCode = 1
versionName = "1.0"
  • targetSdk에 명시한 안드로이드 SDK는 기본으로 적용
  • 개발자가 추가하는 오픈소스 라이브러리나 androidx 라이브러리 등 SDK 라이브러리가 아닌 것들은 모두 dependencies에 선언
// 라이브러리 설정
dependencies {
    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.appcompat)
    implementation(libs.material)
    implementation(libs.androidx.activity)
    implementation(libs.androidx.constraintlayout)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
}

2) 메인 환경 파일

  • 안드로이드 앱의 메인 환경 파일 : AndroidManifest.xml
  • URL이 http://schemas.android.com/apk/res/android 로 선언되었다면 안드로이드 표준 네임 스페이스
1
2
3
<!--> 네임 스페이스 선언<!-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
  • 태그는 앱 전체를 대상으로 한 설정
    • icon 속성 : 지정한 이미지가 앱을 설치한 사용자의 폰에 보이는 실행 아이콘
    • lable 속성 : 앱의 이름 등록
    • theme 속성 : 앱에 적용하는 테마 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-->네임 스페이스 선언<!-->
<application
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.Ch00_firstApplication"
    tools:targetApi="31">
    <!--> ...생략... <!-->
</application>
  • 액티비티 : 태그
  • 서비스 : 태그
  • 브로드캐스트 리시버 : 태그
  • 콘텐츠 프로바이더 : 태그
  • name 속성 : 클래스 이름 등록

  • <intent-filter> 가 선언되고 안에 <action> 태그의 name 속성값이 android.intent.action.MAIN 문자열로, <category> 태그의 name 속성값이 android.intent.category.LAUNCHER로 선언되었으므로 이 액티비티는 앱 아이콘 클릭 시 실행되는 액티비티
1
2
3
4
5
6
7
8
9
<!-->네임 스페이스 선언<!-->
<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

3) 리소스 폴더

ch00-12-res{ width=”60%” }

  • drawble : 이미지 리소스
  • layout : UI 구성에 필요한 XML 리소스
  • mipmap : 앱 아이콘 이미지
  • values : 문자열 등의 값으로 이용되는 리소스

  • 리소스를 식별하기 위한 int형 변수가 R.java 파일에 등록
  • res/layout/test.xml 파일인 경우, R.layout.test

  • res 하위의 폴더명은 지정된 폴더명 사용 필수
  • 각 리소스 폴더에 다시 하위 폴더 정의 불가
  • 리소스 파일명
    • 자바의 이름 규칙 위배 불가
    • 알파벳 대문자 이용 불가

4) 레이아웃 XML 파일

  • 화면을 구성하는 레이아웃 XML 파일
<!-->레이아웃 XML 파일<!-->
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

5) 메인 액티비티 파일

  • setContentView() 함수 : 매개 변수에 지정한 내용을 액티비티 화면에 출력
  • R.layout.activity_main 지정 : res/layout/activity_main.xml 파일의 구성 내용 화면에 출력
  • enableEdgeToEdge() : 액티비티 화면이 상단의 배터리 표시가 있는 영역(Status Bar)과 하단의 안드로이드 버튼이 있는 영역(Navigation Bar)까지 나오게 하는 설정
  • setOnApplyWindowInsetsListener() : 액티비티에 출력되는 내용이 Navigation Bar 등과 겹치지 않게 하기 위한 설정
1
2
3
4
5
6
7
8
9
10
11
12
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
    }
}
This post is licensed under CC BY 4.0 by the author.