2024. 3. 18. 16:59, ๐ฑAndroid Study
๋ฐ์ํ
Gradle๋น๋ ์ค์ ํ์ผ
- Gradle: ์๋๋ก์ด๋ ์ฑ์ ๋น๋ ๋๊ตฌ
- Gradle์ ์ค์ ํ์ผ: build.gradle
- ํ๋ก์ ํธ ์์ค์ build.gradle(Project:AndroidLab)
- ๋ชจ๋ ์์ค์ build.gradle(Module:AndroidLab.app)
์ฃผ์๋ฉ๋ด
- Bookmarks
- ๋ถ๋งํฌ ํ ์ฝ๋ ์ค์์ F11์ ๋๋ฅด๋ฉด ๋ถ๋งํฌ ๋ฑ๋ก, ์ผ์ชฝ Bookmarks๋ Ctrl + F11์ผ๋ก ๋ถ๋งํฌ ๋ณด๊ธฐ ๊ฐ๋ฅ - Build Variants
- ๋ฆด๋ฆฌ์ฆ ์ฑ์ธ์ง, ํ ์คํธ์ฉ ๋๋ฒ๊น ์ฑ์ธ์ง ์ต์ ์ค์ - Structure
- ํจ์๋ช ์ด๋ ๋ณ์๋ช ์ ํ ๋ฒ์ ๋ณผ ์ ์๊ฒ ํด์ค - Version Control
- Git ์ฐ๊ฒฐํ์ฌ ๋ฒ์ ์ปจํธ๋กค - Profiler
- ์ฑ์ ์คํ ์ํค๊ณ CPU, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๋คํธ์ํฌ ์ฌ์ฉ๋ ๋ฑ์ ๋ถ์ - Logcat
- ๊ธฐ๋ณธ์ ์ธ ๋ก๊ทธ๋ฅผ ํ์ธํ๋ฉด์ ๊ฐ๋ฐ, ์ ์ผ ๋ง์ด ์ - App inspection
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์ด ๋ณผ ๋ ํ์ธ
์์ฃผ ์ฐ๋ ๋จ์ถํค
- ์ฃผ์ ์ฒ๋ฆฌ : ctrl + /
- ์ฝ๋ ๋ณต์ฌ: ctrl + d
- ์ฝ๋ ์ ๋ ฌ: ctrl + alt + l
- ctrl+ํด๋ฆญ์ผ๋ก ๋ค๋ฅธ ์ฝ๋์ ๋ค์ด๊ฐ๋ค๊ฐ ๋ค์ ์๋ ์ฝ๋๋ก ์ ํ: ctrl + ]
ํ์ผ ๊ตฌ์ฑ
1. AndroidManifest ํ์ผ
- ์ฑ์ ๊ธฐ๋ณธ ํน์ง์ ์ค๋ช ํ๊ณ , ์ฑ์ ๊ตฌ์ฑ์์์ธ ์ปดํฌ๋ํธ (์: ์กํฐ๋นํฐ, ์๋น์ค ๋ฑ)๋ฅผ ์ ์ํ XMLํ์ผ
- <manifest>ํ๊ทธ
- package์์ฑ. ์ด ์ฑ์ ๊ณ ์ ํ ์๋ณ์ ์ญํ ์ ํ๋ ํจํค์ง ์ด๋ฆ์ด ์ ์ - <application>ํ๊ทธ
- ์ด ์ฑ์ ๊ตฌ์ฑํ๊ณ ์๋ ์ปดํฌ๋ํธ๋ฅผ<application>ํ๊ทธ ํ์์ ์ ์
- ์ปดํฌ๋ํธ ์ข ๋ฅ์ ๋ฐ๋ฅธ ํ๊ทธ
- ์กํฐ๋นํฐ์ ๊ฒฝ์ฐ<activity>์์
- ์๋น์ค์ ๊ฒฝ์ฐ<service>์์
- ๋ธ๋ก๋ ์บ์คํธ ์์ ๊ธฐ์ ๊ฒฝ์ฐ<receiver>์์
- ์ฝํ ์ธ ์ ๊ณต์์ ๊ฒฝ์ฐ<provider>์์ - <activity>ํ๊ทธ
- android:name ์์ฑ์ด Activity ์๋ธ ํด๋์ค์ ์์ ํ ์ ๊ทํ๋ ํด๋์ค ์ด๋ฆ์ ๋ํ๋
- ์ฌ๊ธฐ์๋ ์ด๋ฆ์ด Main Activity์ธ Activity ์๋ธ ํด๋์ค๊ฐ ์ฑ์ ๊ตฌ์ฑํ๋ ์ ์ผํ ์ปดํฌ๋ํธ์ - <intent-filter>ํ๊ทธ
- ์๋๋ก์ด๋ ์ปดํฌ๋ํธ(์,<activity>ํ๊ทธ) ํ์์ ํฌํจ๋๋ ํ๊ทธ
- ํด๋น ์ปดํฌ๋ํธ๊ฐ ์์ ํ ์ ์๋ ์ธํ ํธ๋ฅผ ๊ฑธ๋ฌ๋ด๋ ์ญํ
- MainActivity์ธ ์กํฐ๋นํฐ ์ปดํฌ๋ํธ๊ฐ ์ฑ์ ์์์ํค๋ ์์์ ์ผ๋ก์,
์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ฒ (์: ํ์คํฌ๋ฆฐ)์ ๋ฑ๋ก๋์ด ์์์ ๋ํ๋
2. Resource
- ๋ฆฌ์์ค๋ฅผ ์ฝํ๋ฆฐ ์ฝ๋์์ ๋ถ๋ฆฌํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ง/๊ด๋ฆฌ
- ๋ค์ํ ํ๊ฒฝ ๋ณํ(์,ํ๋ฉดํฌ๊ธฐ ๋ณํ ํน์ ์ฌ์ฉ ์ธ์ด ๋ณ๊ฒฝ)๋ฅผ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ์์ฉ
- ๋ฆฌ์์ค ํด๋ ๊ตฌ์ฑ
- drawable: ์ด๋ฏธ์ง ๋ฆฌ์์ค
- layout: UI๊ตฌ์ฑ์ ํ์ํ XML ๋ฆฌ์์ค
- mipmap: ์ฑ ์์ด์ฝ ์ด๋ฏธ์ง
- values: ๋ฌธ์์ด ๋ฑ์ ๊ฐ์ผ๋ก ์ด์ฉ๋๋ ๋ฆฌ์์ค - ์ฃผ์ ์ฌํญ
- res ํ์์ ํด๋ ๋ช ์ ์ง์ ๋ ํด๋ ๋ช ์ ์ฌ์ฉํด์ผ ํจ (์์ ์์ฑ X)
- ๊ฐ ๋ฆฌ์์ค ํด๋์ ๋ค์ ํ์ ํด๋๋ฅผ ์ ์ ํ ์ ์์
- File-based resource names must contain only lowercase a~z, 0~9, or underscore(_)
- ์์ ๊ฐ์ด ๋ฆฌ์์ค ํ์ผ ๋ช ์๋ ์ํ๋ฒณ ๋๋ฌธ์๋ฅผ ์ด์ฉ ํ ์ ์์
3. R.java
- aapt๋๊ตฌ์ ์ํด ์๋์ผ๋ก ์์ฑ ๋ ํ์ผ
- ๋ฆฌ์์ค๋ฅผ kotlin ํ๋ก๊ทธ๋จ์์ ์ ๊ทผํ๊ธฐ ์ํ ๋ฆฌ์์ค ID๋ฅผ ์ ์
- ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ๋๋ ์ค์ ๋ก ์ด๋ ๊ฒ ์์ฑ๋ Rํ์ผ ๋ด์ ์ฃผ์๋ฅผ ๊ฐ์ ธ์์ ์ (์: activity_main = 0x7f09001b; ...)
- aapt ๋๊ตฌ: ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ์์ค๋ฅผ ์ปดํ์ผํ์ฌ ์ปดํ์ผ ๋ ๋ฆฌ์์ค (Rํด๋์ค์ ํจํค์ง ๋ ๋ฆฌ์์ค ํ์ผ)์ ์๋์ผ๋ก ์์ฑ
4. ์ฝํ๋ฆฐ ์์ค ํ์ผ (.kt)
- ํจํค์ง๋ช , import, class(ํด๋์ค ์ ์์ ๋ฉ์๋) ๋ฑ์ผ๋ก ๊ตฌ์ฑ
- MainActivity์ ์
- package com.android.helloworld
- MainActivity ํด๋์ค๊ฐ ์ํ ํจํค์ง
- ์๋๋ก์ด๋ ํ๋ก์ ํธ ์์ฑ ์์ ์ค์ ๋ ์ ๋ํฌํ ์ด๋ฆ
- ํจํค์ง๋ช ์ ์ค๋ณต ๋ถ๊ฐ - class MainActivity : AppCompatActivity()
- ์๋๋ก์ด๋ ์กํฐ๋นํฐ๋ Activity์ ์๋ธ ํด๋์ค
- AppCompatActivity๋ Activity์ ์๋ธ ํด๋์ค๋ก์ ํ์ ํ๋ซํผ ๋ฒ์ ์ ์ง์ - override fun onCreate (savedInstanceState : Bundle?)
- ์๋ช ์ฃผ๊ธฐ ์ค onCreate ์ฌ์ฉ
- ์๋๋ก์ด๋ ํ๋ซํผ์ด ํธ์ถํ๋ ๋ฉ์๋๋ก์ ์กํฐ๋นํฐ๊ฐ ์์ฑ๋๋ ์๊ฐ์ ๋ฑ ํ ๋ฒ ํธ์ถ๋จ
- ์ฃผ๋ก ์กํฐ๋นํฐ์ ๊ด๋ จ๋ ๋ณ์ ์ด๊ธฐํ ๋ฐ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ค์ ์ฝ๋๋ฅผ ํฌํจ - setContentView(R.layout.activity_main)
- R.layout.activity_main์ด ๊ฐ๋ฆฌํค๋ ๋ฆฌ์์ค๋ฅผ ์ด ์กํฐ๋นํฐ์ ์ฝํ ์ธ ๋ทฐ๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ
- R.layout.activity_main์ res/layout ํด๋์ ์๋ activity_main.xml์ ๊ฐ๋ฆฌํค๋ ์ ์ ์์ (R ํด๋์ค์์ ์ ์๋จ)
Build Gradle
- ํ๋ก์ ํธ ๋ ๋ฒจ, ๋ชจ๋ ๋ ๋ฒจ ๋ ๊ฐ๋ก ๊ตฌ์ฑ
- ํ๋ก์ ํธ ๋ ๋ฒจ์์๋ ํ๋ก์ ํธ์ ๋ชจ๋ ๋ชจ๋์ ์ ์ฉ๋๋ ๋น๋ ๊ตฌ์ฑ์ ์ ์
- buildscript{} ๋ธ๋ก: ๋ชจ๋ ๋ชจ๋์ ๊ณตํต๋๋ Gradle ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ข ์์ฑ์ ์ ์
- allprojects{} ๋ธ๋ก: ํ ํ๋ก์ ํธ์ ๋ชจ๋ ๋ชจ๋์์ ์ฌ์ฉ๋๋ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ข ์์ฑ์ ์ ์ - ๋ชจ๋ ๋ ๋ฒจ์์๋ ๋ชจ๋์ ๋น๋ ๊ตฌ์ฑ์ ์ ์
- compileSdkVersion : ์ปดํ์ผ ์์ ์ฌ์ฉํ SDK ๋ฒ์
- minSdkVersion : ์ฑ์ด ์ง์ํ๋ ์ต์ API ๋ฒ์
- targetSdkVersion : ์ฑ์ ํ ์คํธํ๊ธฐ ์ํด ์ฌ์ฉํ API๋ฒ์
- versionCode : ์ฑ ๋ฒ์ ์ค์
- dependencies : ๋ชจ๋ ์์ฒด๋ฅผ ๋น๋ํ๊ธฐ ์ํด ์๊ตฌ๋๋ ์ข ์์ฑ ๋ช ์ธ. ์ธ๋ถ ์ ์ฅ์์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ฐ์ ๋น๋
๋ฆฌ์์ค ํ์ผ ์ฌ์ ์
- ๋ ์ด์์ xml ํ์ผ์ ๋ฐ๋ก ํ ์คํธ๋ฅผ ์ ๋ ฅํ๋ ๊ฒ(ํ๋ ์ฝ๋ฉ)๊ณผ,
- values์ strings.xml์ <string name="app_content_text"> ์๋
ํ์ธ์! </string> ๋ก ์ ์ ํ
๋ ์ด์์ xml ํ์ผ์์ android:text="@string/app_content_text" ํํ๋ก ๊ฐ์ ธ์ค๋ ๊ฑด ํฐ ์ฐจ์ด๊ฐ ์์ - ๋ค๊ตญ์ด ์ง์๋๋ ์ฑ์ ๋ง๋๋ ค๋ฉด ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก ๋ง๋ค์ด์ผ๋ง ๊ฐ๋ฅ
(strings_kr.xml, strings_en.xml ๋ฑ์ผ๋ก ๋ง๋ค์ด์ ๋๊ฐ์ ๋ฆฌ์์ค ์ด๋ฆ์ผ๋ก ์ ์)
์ค์ต
๋๋ณด๊ธฐ
MainActivity.kt
package com.android.lab3_dice
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import java.util.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tv_num = findViewById<TextView>(R.id.tv_number)
val btn_dice = findViewById<Button>(R.id.btn_roll) // xml์ ์์๋ฅผ ๊ฐ์ ธ์์ ์ ์ธ
btn_dice.setOnClickListener{ // ํด๋ฆญ ์ ์๋
val random = Random
val num = random.nextInt(6) + 1 // nextInt(6)์ 0๋ถํฐ 5๊น์ง ์ด๋ฏ๋ก +1
tv_num.text = num.toString() // TextView์ ํ์, text๋ ์คํธ๋งํ๋ง ๊ฐ๋ฅํ๋ฏ๋ก ํ๋ณํ
}
}
}
activity_main.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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Roll the Dice"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_roll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="ROLL"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_number" />
</androidx.constraintlayout.widget.ConstraintLayout>
๋ฐ์ํ
๐ฌ C O M M E N T