Udacity์์ Developing Android Apps with Kotlin ์ด๋ผ๋ ๊ฐ์๋ฅผ ๋ฃ๊ณ lesson ๋ณ๋ก ์ค์ํ๋ค๊ณ ์๊ฐํ ๋ถ๋ถ์ ํ๊ธฐํ ๋ด์ฉ์ด๋ค.
์์ด ๊ฐ์๋ฅผ ๋ฃ๊ณ ํ๊ธฐํ ๋ด์ฉ์ด๋ค๋ณด๋ ๋ฒ์ญ์ด๋ ํด์์ด ์๋ชป๋ ๋ถ๋ถ์ด ์์ ์ ์๋ค. ๋ ์ผ๋ถ๋ ์์ด ๋จ์ด๋ ๋ฌธ์ฅ์ ๊ทธ๋๋ก ์ ์ด๋์๋ค.
์ ํํ ๋ด์ฉ์ ๊ฐ์๋ฅผ ์ง์ ์ฐธ๊ณ ํ๋ ๊ฒ์ ๊ถํ๋ค.
9. Main App Anatomy
- Kotlin files: ์ฑ์ ์ฝ์ด ๋ก์ง
- res folder: ์ด๋ฏธ์ง, ์คํธ๋ง ๊ฐ์ ์ ์ ์ปจํ ์ธ
- AndroidManifest.xml: OS์์ ์ฑ์ ๊ตฌ๋์ํฌ ์ ์๋๋ก app์ ํ์์์๋ค์ ๋ํ ์ ์
- Gradle script: ์ฑ ๋น๋ ๋ฐ ์คํ์ ์ํ ๊ฒ
11. Activity and Layout
Activity๊ฐ ์์๋๋ฉด layout inflation ๊ณผ์ ์ด ์์๋๋๋ฐ layout inflation ๋์์ XML Layout ํ์ผ์ ์ ์๋ view ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ Kotlin view ๊ฐ์ฒด๋ก ๋ฉ๋ชจ๋ฆฌ์ *inflate ๋๋ค.
์ด ๊ณผ์ ์ด ์งํ๋๋ฉด activity๋ ์ด ๊ฐ์ฒด๋ค์ ์คํฌ๋ฆฐ์ ๊ทธ๋ฆฌ๊ณ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์๋ ์๊ฒ ๋๋ค.
*inflate: (๊ณต๊ธฐ๋ ๊ฐ์ค๋ก) ๋ถํ๋ฆฌ๋ค[๋ถํ๋ค]
15. Connecting the Button
๋งค๋ฒ XML ํ์ผ์ view๋ฅผ ์ํ ID๋ฅผ ์ ์ํ๋ฉด ์๋๋ก์ด๋ ์คํ๋์ค๋ ์๋์ผ๋ก ID์ ํจ๊ป R(Resource) ํด๋์ค์ ์ ์ํ ์์(Integer constant)๋ฅผ ์์ฑํ๋ค. R ํด๋์ค๋ ํ๋ก์ ํธ ๋ด์ ๋ชจ๋ resources ๋งคํ ๊ฐ์ ๊ฐ๊ณ ์๋ค. ๋ฉ๋ชจ๋ฆฌ์์ ํด๋น id์ view๋ฅผ ์ฐพ์ผ๋ฉด Kotlin view object์ reference๋ฅผ return ํด์ activity ๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
โญ๏ธ View binding: ์๋๋ก์ด๋ ์คํ๋์ค 3.6+ ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก findViewById๋ฅผ ๋์ฒดํ๋ค. View binding์ ๊ฐ XML Layout ๋ง๋ค binding ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
// Creating a binding object for the main_activity.xml layout
binding = ActivityMainBinding.inflate(layoutInflater)
// Referencing a view with the ID roll_button
binding.rollButton
View binding์ 1) Type safety 2) Null safety๋ผ๋ ์ด์ ์ ๊ฐ๊ณ ์๋ค.
1) Type safety: findViewById๋ ๋ฐํ๋ฐ๊ธฐ ์ํ๋ ํ์
์ ๋ช
์ํ๊ธฐ๋ฅผ ์๊ตฌํ๋ค. ์๋ฅผ ๋ค๋ฉด, ์ค์ ํ์
์ Button์ธ๋ฐ ์ค์๋ก ImageButton์ ๋ฐํ๋ฐ๋ ๊ฒ์ผ๋ก ๋ช
์ํ์๋ค๋ฉด ClassCastException์ด ๋ฐ์ํ ๊ฒ์ด๋ค. View binding์ View๊ฐ binding์ ์ฌ๋ฐ๋ฅธ ํ์ ์์ฑ์ผ๋ก ์ด๋ฌํ ํ์
์ ์๋ฌ๋ก๋ถํฐ ๋ณดํธํด์ค๋ค.
2) Null safety: findViewById๋ view์ resource id๋ฅผ ๋ปํ๋ ์ ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ์์ํ๋ค. ๊ทธ๋ฐ๋ฐ ํ๋ผ๋ฏธํฐ๋ก ๊ด๋ จ ์๋ ์ ์์ ์ ํจํ์ง ์์ view id์ ๊ฐ์ ์ด๋ ํ ์ ์๋ ์ง ๋๊ฒจ์ฃผ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ๋ง์ฝ ๋ ์ด์์ ๋ด์ view resource id์ ๋งค์น๋์ง ์๋ ์ ์๋ฅผ ๋๊ฒจ์ฃผ๋ ๊ฒฝ์ฐ findViewById๋ null์ ๋ฐํํ๊ณ NullPointerException์ ๋ฐ์ํ ์ ์๋ค. View binding์ view ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ์ฐธ์กฐํ๊ณ ์ ์ํ id๋ก ์ฐพ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ null์์ ์์ ํ๋ค๊ณ ํ ์ ์๋ค.
17. Exercise: OnClickListener
Context ๊ฐ์ฒด: ์๋๋ก์ด๋ OS์ ํ์ฌ ์ํ์ ๋ํ ์ ๋ณด๋ฅผ ์ป๊ณ ํต์ ํ ์ ์๊ฒ ํด ์ค๋ค. ๋ํ MainActivity๋ context์ subclass๋ก MainActivity ๋ด๋ถ์์ this ํค์๋๋ context ๊ฐ์ฒด์ด๋ค.
23. Exercise: Finding Views Efficiently
findViewById()๋ก view hierarchy๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ expensive operation์ด๋ค. ๋ฐ๋ผ์ ํ๋๋ก ์ ์ํด์ฃผ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ํ๋๋ฅผ ์ด๋์ ์ด๊ธฐํํ ๊ฒ์ด๋๋ ๊ฒ์ด๋ค.
์๋๋ก์ด๋์์๋ activity constructor์ ์ฝ๋๋ฅผ ์ฐ์ง ์๋๋ค. ๋ layout์ view๋ setCotentView()๊ฐ ํธ์ถ๋์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ๋๊น์ง ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ด ๋ง์ setContentView()๊ฐ ํธ์ถ๋๊ณ ๋์์ผ view ํ๋๋ฅผ ์ด๊ธฐํํด์ค ์ ์๋ค๋ ๊ฒ์ด๋ค.
ํด๊ฒฐ์ฑ
1๏ธโฃ: view ํ๋๋ฅผ nullable ํ๋๋ก ์ง์ ํ๊ณ ๋จผ์ null๋ก ์ด๊ธฐํํ๋ค. setContentView() ๋ค์์ ๊ฐ์ ๋ฃ์ด์ค๋ค.
โก๏ธ ์ด ๋ฐฉ๋ฒ์ ์ฝ๋๋ฅผ ๋ณต์กํ๊ฒ ํ๋ค. ์๋ํ๋ฉด ๋งค๋ฒ view ํ๋๋ฅผ ์ฌ์ฉํ ๋ null ์ฒดํฌ๋ฅผ ํด์ค์ผ ํ๋ค.
ํด๊ฒฐ์ฑ
2๏ธโฃ: ์๋๋ก์ด๋์์ non-null ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ ๋ฒ. lateinit ํค์๋ ์ฌ์ฉํ๊ธฐ.
ํ๋ ๊ฐ์ฅ ์์ lateinit์ ์จ์ฃผ๋ฉด Kotlin ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ค ๋ค๋ฅธ operation ์ ์ ์ด๊ธฐํํ ๊ฒ์ ์ฝ์ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์ ์ญ์ null๋ก ๋๋์ง ์์ ๊ฒ์์ ์ฝ์ํ๋ ๊ฒ์ธ๋ฐ ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ nullable ๋ณ์๋ก ์ง์ ํด์ฃผ๊ฑฐ๋ null๋ก ์ด๊ธฐํํ ํ์๊ฐ ์๋ค. setContentView() ๋ค์์์ ์ด๊ธฐํํด์ฃผ๋ฉด ๋๋ค.
24. Namespaces
dummy data๋ฅผ preview pane์์ preview ํ๋ ค๋ฉด tools:src="@drawable/<src-name>"์ ํด์ฃผ๋ฉด ๋๋๋ฐ android:src="@drawable/<src-name>" ๊ณผ ๋น๊ตํด์ ๋ ๋ค src๋ผ๋ ๊ฐ์ attribute๋ฅผ ์ฌ์ฉํ์ง๋ง ์ฝ๋ก ์์ namespace๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ญํ ์ ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. dummy data๋ ์ปดํ์ผํ ๋๋ ์ ๊ฑฐ๋๋ค.
25. Introduction to Gradle
Gradle: Android Bulid tool
- Describing what devices the app is actually build to run on
- Compiling code and resources into executable code
- Declaring and managing dependent code and libraries(dependencies)
- App signing for Google play
- Running automated tests
Gradle ์คํ ๊ณผ์
Run ๋ฒํผ ํด๋ฆญ โก๏ธ Gradle ๋ช ๋ น์ด๋ค์ด ์์ค์ฝ๋, dependencies, Resources, Others๋ฅผ ์ปดํ์ผ โก๏ธ Android Application Package(APK: disributing ์๋๋ก์ด๋ ์ฑ์ ์คํ ๊ฐ๋ฅํ ํฌ๋งท)๋ก ๋ง๋ฆ โก๏ธ ์๋๋ก์ด๋ ์คํ๋์ค๋ APK๋ฅผ ์ค์ ๊ธฐ๊ธฐ๋ ์ ๋ฎฌ๋ ์ดํฐ๋ก ์ ์กํ์ฌ ์ค์น ํ ์คํ
Gradle ํ์ผ์ ์ข ๋ฅ
1๏ธโฃ bulid.gradle(Project): Project wide build settings.
2๏ธโฃ build.gradle(Module:app): For each *module of project.
*module: Collections of source file and build settings for a discrete unit of functionality in app. ๋ณดํต default๋ก ํ ๊ฐ์ ๋ชจ๋ App์ด ์๋๋ฐ ๋ ํฐ ์ฑ์์ ๊ธฐ๋ฅ์ ๋๋๋ค ๋ณด๋ฉด ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ๋ก ์์ฑํ๊ฑฐ๋ ํ๋ค ๋ณด๋ฉด ๋ชจ๋์ ๋ ๋ง๋ค๊ฒ ๋๊ณ ๊ฐ ๋ชจ๋์ build.gradle ํ์ผ์ด ์๊ธด๋ค.
27. Android Compatibility
androidx๋ Android Jetpack namespace.
AppCompatActivity๋ compatibility class, activity๊ฐ menu bar(action bar)๋ฅผ ํฌํจํ๋๋ก ํด์ค.
28. Exercise: Vector Drawables
vector drawables๋ API 21 ์ด์์์ ์ง์ํ๋ค. ๋ง์ฝ ์ฑ ์์ฑ ์ minSdkVersion์ด 19๋ผ๋ฉด API 19, 20์์๋ vector drawables๋ฅผ ์ด๋ป๊ฒ ๋ณด์ฌ์ฃผ๋๊ฐ?
gradle์ด png ํ์ผ์ ๋ง๋ค์ด์ API 21๋ณด๋ค ๋ฎ์ sdk์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ ๋ฌธ์ ๋ png๋ค์ด ์ฑ ํฌ๊ธฐ๋ฅผ ๋๋ฆฐ๋ค๋ ๊ฒ์ด๋ค. ์ฑ ํฌ๊ธฐ๊ฐ ํฌ๋ฉด ๋ค์ด๋ก๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ณ ๋๋ฐ์ด์ค ์ฉ๋๋ ๋ง์ด ์ฐจ์งํ๊ณ ์ฌ์ฉ์ ๋ถ๋ง์ด ๋๊ธฐ ์ฝ๋ค.
๐กํด๊ฒฐ๋ฐฉ์: androidx ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ vector drawables๋ฅผ API 7๋ถํฐ ์ง์๋๊ฒ ๋์์ค๋ค.
1๏ธโฃ build.gradle(app)์ androidx vector support ๊ฐ๋ฅํ๋๋ก ์ถ๊ฐ
vectorDrawables.useSupportLibrary = true
2๏ธโฃ layout์ root์ ์๋ก์ด namespace ์ถ๊ฐ
xmlns:app="http://schemas.android.com/apk/res-auto"
3๏ธโฃ ๋ ์ด์์ ํ์ผ์ ์ด๋ฏธ์ง ํ๊ทธ์ app:srcCompat ์ฌ์ฉํ์ฌ ์ถ๊ฐ
app:srcCompat="@drawable/<src-name>"
'Android & Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Lesson 5: App Architecture(UI Layer) (0) | 2022.02.22 |
---|---|
๊ณต๋ถ ์ฃผ์ (0) | 2022.02.19 |
Lesson 4: Activity & Fragment Lifecycle (0) | 2022.02.11 |
Lesson 3: App Navigation (0) | 2022.02.08 |
Lesson 2: Layouts (0) | 2022.02.06 |