[Android ๊ธฐ์ดˆ] 3. ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ํŒŒ์ผ ๊ตฌ์„ฑ
๋ฐ˜์‘ํ˜•

 

 

 

 

 

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