[Android ๊ธฐ์ดˆ] 2. ๊ฐœ๋ฐœ ๋„๊ตฌ IDE, AVD์‹คํ–‰, XML ๊ธฐ๋ณธ ๊ตฌ์กฐ
๋ฐ˜์‘ํ˜•

 

 


1 ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ์„ค์น˜/์‹œ์ž‘

 

 

ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜ํ•˜๊ธฐ

 

 

 

์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ์ต์ˆ™ํ•ด์ง€๊ธฐ

 

 

  • ํˆด๋ฐ”: ์•ฑ ๋ฐ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‹คํ–‰, SDK ๋‹ค์šด๋กœ๋“œ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰
  • ๋„๊ตฌ์ฐฝ ๋ชจ์Œ: ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ์ฐฝ์˜ ๋‘˜๋ ˆ์— ์žˆ์œผ๋ฉฐ ๊ฐœ๋ณ„ ๋„๊ตฌ ์ฐฝ์„ ํŽผ์น˜๊ฑฐ๋‚˜ ์ ‘์„ ์ˆ˜ ์žˆ์Œ
  • ๋„๊ตฌ ์ฐฝ:  ์œˆ๋„์šฐ์˜ ํƒ์ƒ‰๊ธฐ๋‚˜ ๋งฅ์˜ ํŒŒ์ธ๋”์ฒ˜๋Ÿผ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ์†Œ์Šค ํŒŒ์ผ, ์„ค์ • ํŒŒ์ผ, ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“ฑ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ. ๋˜ํ•œ ๋กœ๊ทธ ๋ณด๊ธฐ, ๋ฒ„์ „ ๊ด€๋ฆฌ, ํ„ฐ๋ฏธ๋„ ์‹คํ–‰ ๋“ฑ์˜ ํŠน์ • ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋„๊ตฌ ์ฐฝ ์•„๋ž˜์ชฝ์˜ ํƒญ์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๋„๊ตฌ๋ฅผ ์—ด ์ˆ˜ ์žˆ๊ณ , ์˜ค๋ฅธ์ชฝ ์œ„์˜ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ฐฝ์„ ๋‹ซ์„ ์ˆ˜ ์žˆ์Œ
  • ํŽธ์ง‘๊ธฐ ์ฐฝ: ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ (ํŒŒ์ผ ์œ ํ˜•์— ๋”ฐ๋ผ ํŽธ์ง‘๊ธฐ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ)
  • ์ƒํƒœ ํ‘œ์‹œ์ค„: ํ”„๋กœ์ ํŠธ์™€ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์˜ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•˜๋ฉฐ ๊ฒฝ๊ณ  ๋˜๋Š” ๊ธฐํƒ€ ํ•„์š”ํ•œ ๋ฉ”์‹œ์ง€๋„ ํ‘œ์‹œ

 

 

 

 

์•ˆ๋“œ๋กœ์ด๋“œ SDK ๊ธฐ๋ณธ ์„ค์ • ํ™•์ธํ•˜๊ธฐ

 

 

  • ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋Š” ํŽธ์ง‘์„ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ผ ๋ฟ, ์‹ค์ œ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์€ ๋ชจ๋‘ SDK์— ์žˆ์Œ
  • ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋Š” ์ด SDK๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ตœ์ข… ์„ค์น˜ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์คŒ
  • (์œˆ๋„์šฐ) File - Settings - Languages & Frameworks - Android SDK๋ฅผ ํด๋ฆญ
    Android SDK Location์—์„œ ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅ

 

 

 

SDK Platforms

  • File - Settings - Languages & Frameworks - Android SDK - SDK Platforms ํƒญ
    ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋žซํผ์ด ๋ฒ„์ „๋ณ„๋กœ ํ‘œ์‹œ๋œ ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅ
  • ์ปดํ“จํ„ฐ์— ์„ค์น˜๋œ ํ”Œ๋žซํผ์€ Status ๋ถ€๋ถ„์ด "Installed"๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉฐ
    "Not Installed"๋กœ ํ‘œ์‹œ๋œ ํ”Œ๋žซํผ ์ค‘ ์„ค์น˜๋ฅผ ์›ํ•˜๋Š” ํ”Œ๋žซํผ ์ด๋ฆ„ ์•ž์˜ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์ฒดํฌํ•ด์„œ ์„ค์น˜ ํ•ญ๋ชฉ ์„ ํƒ ๊ฐ€๋Šฅ

 

 

 

SDK Tools

 

 

  • File - Settings - Languages & Frameworks - Android SDK - SDK Tools ํƒญ
    ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ(์—๋ฎฌ๋ ˆ์ดํ„ฐ, ๋””๋ฒ„๊ฑฐ ๋“ฑ)์˜ ๋ชฉ๋ก์„ ํ™•์ธ
  • Android SDK Build-Tools
    : ๋ฆฌ์†Œ์Šค ์•„์ด๋””๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” R ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์„ค์น˜ ํŒŒ์ผ์ธ APK ํŒŒ์ผ์„ ์ตœ์ ํ™” ํ•˜๋Š” ๋„๊ตฌ
      ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ(Java Bytecode)๋ฅผ ๋‹ฌ๋น… ๋ฐ”์ดํŠธ์ฝ”๊ทธ(Dalvik Bytecode)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋„๊ตฌ๋„ ํฌํ•จ
  • Android Emulator
    : ๊ฐ€์ƒ์˜ ์Šค๋งˆํŠธํฐ ํ™˜๊ฒฝ์œผ๋กœ ์•ฑ์„ ์„ค์น˜ํ•˜๊ณ  ํ…Œ์ŠคํŠธ
  • Android SDK Platform-Tools
    : ์—๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ์Šค๋งˆํŠธํฐ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ADB(Android Debug Bridge)๋ผ๋Š” ๋„๊ตฌ์™€
      ์„ฑ๋Šฅ ๋ถ„์„ ๋„๊ตฌ์ธ Systrace๊ฐ€ ์ œ๊ณต
  • Intel x86 Emulator Accelerator(HAXM installer)
    : ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•ด์ฃผ๋Š” ํ•˜๋“œ์›จ์–ด ๊ฐ€์†๊ธฐ
      ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Œ

 

 

 

SDK Update Sites

 

 

  • File - Settings - Appearance & Behavior - System Settings - Android SDK - SDK Update Sites ํƒญ
  • ํ•„์š”ํ•œ ๋„๊ตฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์‚ฌ์ดํŠธ ์ฃผ์†Œ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ๋“ฑ๋ก ๊ฐ€๋Šฅ
  • ์ˆ˜์ •์ด ์žˆ์œผ๋ฉด Apply๋ฅผ ํด๋ฆญํ•˜๊ณ  ์—†์œผ๋ฉด OK๋ฅผ ํด๋ฆญํ•ด์„œ ์ฐฝ์„ ๋‹ซ์Œ

 

 

 

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ

 

 

  • ํ”„๋กœ์ ํŠธ(Project) : ์†Œ์Šค ์ฝ”๋“œ์™€ ์ด๋ฏธ์ง€, ์Œ์•…, ํ…์ŠคํŠธ ํŒŒ์ผ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ
  • ๋Œ€๋ถ€๋ถ„์˜ ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์€ ํ•„์š”์— ๋”ฐ๋ผ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์— ์ƒ์„ฑ๋˜๋Š” ์‹ค์ œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์žฌ๋ฐฐ์—ดํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ,
    ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋„ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์— ๋ณด์ด๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ ์‹ค์ œ ํƒ์ƒ‰๊ธฐ ์ƒ์˜ ํŒŒ์ผ ๊ตฌ์กฐ
    ํ•„์š”์— ๋”ฐ๋ผ ์‹ค์ œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ทฐ(Project๋ทฐ), Android ๋ทฐ ์ „ํ™˜ํ•˜๋ฉด์„œ ์‚ฌ์šฉ

 

 

 

 

Android ๋ทฐ์˜ ๊ตฌ์กฐ

 

 

  • Android ๋ทฐ : ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์„ ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์žฌ๋ฐฐ์น˜ํ•œ ๊ฐ€์ƒ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ
  • Project ๋ทฐ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๋ฏ€๋กœ, ๋ณดํ†ต ์ž‘์—…ํ•  ๋•Œ๋Š” Android๋กœ ๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœ
  • ํฌ๊ฒŒ app๊ณผ Gradle Scripts๋กœ ๊ตฌ์„ฑ
    app์—๋Š” ์ฝ”๋”ฉํ•˜๋ฉด์„œ ์ƒ์„ฑํ•œ ๋ชจ๋“  ํŒŒ์ผ์ด ์ €์žฅ๋˜๊ณ , Gradle Scripts์—๋Š” ๋นŒ๋“œ์— ํ•„์š”ํ•œ ์„ค์ • ์ •๋ณด๋“ค์ด ์ €์žฅ
  • manifest: ์„ค์น˜ ๊ด€๋ จ ์ •๋ณด ๋””๋ ‰ํ„ฐ๋ฆฌ
    kotlin+java: ์†Œ์Šค ์ฝ”๋“œ ๋””๋ ‰ํ„ฐ๋ฆฌ
    res: ์ด๋ฏธ์ง€, ๋ ˆ์ด์•„์›ƒ, MP3 ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ„ฐ๋ฆฌ
    Gradle Scripts: ๋นŒ๋“œ ๊ด€๋ จ ์„ค์ • ์ •๋ณด ๋””๋ ‰ํ„ฐ๋ฆฌ

 

 

 

Project ๋ทฐ์˜ ๊ตฌ์กฐ

 

 

  • Project ๋ทฐ : ์‹ค์ œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ตฌ์กฐ
  • ์ด๋ฏธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—… ๋“ฑ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์ถ”์ฒœ
  • app: ์•ฑ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์†Œ์Šค(์ฝ”๋“œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ด๋ฏธ์ง€ ๋“ฑ) ๋””๋ ‰ํ„ฐ๋ฆฌ
    src: ๋‚ด๊ฐ€ ๋งŒ๋“  ์†Œ์Šค(์ฝ”๋“œ, ๋ ˆ์ด์•„์›ƒ, ์ด๋ฏธ์ง€ ๋“ฑ)๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ
    app>src>main>java: ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ(์•„์ง java๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.)
    res: ์ด๋ฏธ์ง€, ๋ ˆ์ด์•„์›ƒ, MP3 ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ„ฐ๋ฆฌ
    AndroidManifest.xml: ์„ค์น˜ ์ •๋ณด ํŒŒ์ผ
    build.gradle: ๋นŒ๋“œ ์ •๋ณด ํŒŒ์ผ

 

 

 


 

2 ์•ฑ์„ ๋งŒ๋“ค์–ด ์‹คํ–‰ํ•˜๊ธฐ

 

 


์—๋ฎฌ๋ ˆ์ดํ„ฐ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ํ•˜๊ธฐ

  • ์—๋ฎฌ๋ ˆ์ดํ„ฐ : ํ•œ ์‹œ์Šคํ…œ์—์„œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์„ ๋ณต์ œํ•ด์„œ ๋ณต์ œ๋œ ์‹œ์Šคํ…œ์ด ์›๋ณธ ์‹œ์Šคํ…œ์„ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•ด์ฃผ๋Š” ๊ฒƒ(๊ฐ€์ƒํ™˜๊ฒฝ)
  • ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—๋„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์„œ ์Šค๋งˆํŠธํฐ์ด ์—†์–ด๋„ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Œ
  • Device Manager - Create Device (+๋ฒ„ํŠผ) - ์›ํ•˜๋Š” ๊ธฐ๊ธฐ ์„ ํƒ - Android ๋ฒ„์ „ ์„ ํƒ - Finish
  • ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ชฉ๋ก์—์„œ ์žฌ์ƒ ๋ฒ„ํŠผ์œผ๋กœ ์‹คํ–‰

 

 

์Šค๋งˆํŠธํฐ ์„ค์ • ๋ฐ ์—ฐ๊ฒฐํ•˜๊ธฐ

  • ์Šค๋งˆํŠธํฐ์˜ ๊ฐœ๋ฐœ์ž ์˜ต์…˜ ํ™œ์„ฑํ™” (๋นŒ๋“œ ๋ฒˆํ˜ธ ํด๋ฆญ ํ›„ ํ™œ์„ฑํ™”)
  • ๊ฐœ๋ฐœ์ž ์˜ต์…˜์— ๋“ค์–ด USB ๋””๋ฒ„๊น… ํ™œ์„ฑํ™”, USB ์ผ€์ด๋ธ”์„ ์ด์šฉํ•ด ์—ฐ๊ฒฐ ๋’ค ๊ธฐ๊ธฐ ๋ชฉ๋ก์—์„œ ์„ ํƒํ•˜์—ฌ ์‹คํ–‰

 

 

์•ฑ ๋งŒ๋“ค์–ด ์‹คํ–‰ํ•˜๊ธฐ

 

์•ฑ์„ ๋งŒ๋“ค์–ด ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ • (4๋‹จ๊ณ„)

1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ
2. ๋ ˆ์ด์•„์›ƒ ํŽธ์ง‘ํ•˜๊ธฐ
3. ์†Œ์Šค ์ฝ”๋“œ ์—ฐ๊ฒฐํ•˜๊ธฐ
4. ์•ฑ ์‹คํ–‰ํ•˜๊ธฐ

 

1๋‹จ๊ณ„: ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

  • "New Project" - Empty Views Activity ํด๋ฆญ
  • Name์—๋Š” ์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ์ด๋ฆ„, Package name์€ ์†Œ๋ฌธ์ž๋กœ, Language๋Š” Kotlin์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    Name: ํ”„๋กœ์ ํŠธ๋ช…
    Package name: ํŒจํ‚ค์ง€๋ช… (ํŒจํ‚ค์ง€๋ช…์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ID์ด๋ฉฐ ๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ, ๋ฐ˜๋“œ์‹œ ์†Œ๋ฌธ์ž)
    Save location: ํ”„๋กœ์ ํŠธ๋ฅผ ์ €์žฅํ•  ์œ„์น˜ 
    Language: ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•  ์–ธ์–ด๋ฅผ ์„ ํƒ
    Minimum SDK: ์ตœ์†Œ ์ง€์› SDK. 98% ์ด์ƒ ๋˜๋Š” ๊ฑฐ ์„ ํƒํ•˜๋ฉด ์ข‹์Œ
    โ€‹


๐Ÿ’ก ํŒจํ‚ค์ง€๋ช…(Package name)์— example์„ ํฌํ•จํ•  ๊ฒฝ์šฐ ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์— ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์—†์Œ
→ ๋ฐ˜๋“œ์‹œ com.ํšŒ์‚ฌ๋ช… ๋˜๋Š” ๋ณธ์ธ์ด๋ฆ„.์•ฑ์ด๋ฆ„ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•จ

 

 

2๋‹จ๊ณ„: ๋ ˆ์ด์•„์›ƒ ํŽธ์ง‘ํ•˜๊ธฐ

  • ๋ ˆ์ด์•„์›ƒ : ํ…์ŠคํŠธ๋‚˜ ์ด๋ฏธ์ง€ ๋“ฑ์„ ํ™”๋ฉด์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ
  • ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ ๋’ค ๊ธฐ๋ณธํ™”๋ฉด์—์„œ ํŽธ์ง‘๊ธฐ ์ฐฝ ์ƒ๋‹จ์— ๋ณด์ด๋Š” ํŒŒ์ผ๋ช…์œผ๋กœ ๋œ ํƒญ์„ ์„ ํƒํ•˜๋ฉด ๋ ˆ์ด์•„์›ƒ ํŽธ์ง‘๊ธฐ๋กœ ์ด๋™
  • ํŒŒ์ผ์˜ ํ™•์žฅ์ž์— ๋”ฐ๋ผ์„œ .kt ํŒŒ์ผ์€ ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ๊ฐ€ ์—ด๋ฆฌ๊ณ , .xml ํŒŒ์ผ์€ ๋ ˆ์ด์•„์›ƒ ํŽธ์ง‘๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ์—ด๋ฆผ

 

๐Ÿ’กํ™”๋ฉด์„ ๊ทธ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜ setContentView

super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)


๊ธฐ๋ณธ์œผ๋กœ ์ƒ์„ฑ๋œ MainActivity์—์„œ ๋ณด๋ฉด setContentView(R.layout.activity_main)๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์Œ
์ด๋Š” '์ฝ˜ํ…์ธ ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ res/layout ๋””๋ ‰ํ„ฐ๋ฆฌ ์•„๋ž˜์— ์žˆ๋Š” activity_main.xml ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค'๋ผ๋Š” ์˜๋ฏธ

 

  • activity_main.xml๋ฅผ ํด๋ฆญํ•˜๋ฉด ํŽธ์ง‘๊ธฐ ์ฐฝ์ด ๋ ˆ์ด์•„์›ƒ์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๋€œ
  • ์šฐ์ธก ์ƒ๋‹จ์— ์žˆ๋Š” ๋ชจ๋“œ ๋ฒ„ํŠผ์„ ํด๋ฆญ - [Code], [Split], [Design] ๋ชจ๋“œ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ ๊ฐ๊ฐ์˜ ๋ชจ๋“œ์—์„œ ํŽธ์ง‘์ด ๊ฐ€๋Šฅ

  • [Design] ๋ชจ๋“œ๋กœ ๋“ค์–ด๊ฐ„ ๋’ค, ์ขŒ์ธก ์ƒ๋‹จ์˜ ํŒ”๋ ˆํŠธ(Palette) - ์ปค๋จผ(Common) - ๋ฒ„ํŠผ(Button)์„ ๋“œ๋ž˜๊ทธ
    ํ™”๋ฉด ์ค‘์•™์˜ 'Hello World!'๋ผ๋Š” ๊ธ€์ž ์•„๋ž˜์— ๊ฐ€์ ธ๋‹ค ๋†“์Œ
    ์ปจ์ŠคํŠธ๋ ˆ์ธํŠธ ํŽธ์ง‘๊ธฐ ์œ„์ชฝ์˜ + ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜๋ฉด 'Hello World!'๊ฐ€ ์“ฐ์—ฌ ์žˆ๋Š” TextView์— ๋ฒ„ํŠผ์˜ ๋ ˆ์ด์•„์›ƒ์ด ์—ฐ๊ฒฐ๋จ

 

๐Ÿ’ก Constraint ํŽธ์ง‘๊ธฐ ์ˆซ์ž์˜ ์˜๋ฏธ

ํŽธ์ง‘๊ธฐ์—์„œ ํด๋ฆญํ•œ + ์œ„์˜ ์ˆซ์ž๋Š” ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ ์š”์†Œ์™€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ„
ex)  "44"๋ผ๋Š” ์ˆซ์ž๋Š” 44dp(Device independence Pixel)๋งŒํผ ๋–จ์–ด์ ธ ์žˆ๋‹ค๋Š” ์˜๋ฏธ

 

๐Ÿ’ก  Constraint 3๊ฐ€์ง€ ๋ชจ๋“œ

  • Wrap Content: ์œ„์ ฏ ์•ˆ์ชฝ์˜ ๋‚ด์šฉ๋ฌผ์— ํฌ๊ธฐ๋ฅผ ๋งž์ถค
  • Fixed: ์›ํ•˜๋Š” ๊ฐ’(์œ„ ๊ทธ๋ฆผ์—์„œ ์œ„์ชฝ ์ปจ์ŠคํŠธ๋ ˆ์ธํŠธ ๊ฐ’์„ 44๋กœ ์„ค์ •)์„ ์ž…๋ ฅํ•˜์—ฌ ๊ฐ€๋กœ ์„ธ๋กœ ์†์„ฑ ํ•„๋“œ์— ์ž…๋ ฅ๋œ ํฌ๊ธฐ์— ๋งž๊ฒŒ ๊ฐ€๋กœ์„ธ๋กœ๋ฅผ ๊ณ ์ •
  • Match Constraint: 0dp๋กœ ์„ค์ •ํ•˜์—ฌ ํฌ๊ธฐ๋ฅผ ์ œ์•ฝ ์กฐ๊ฑด์ธ Constraint ์—ฐ๊ฒฐ๋ถ€์— ๋งž์ถฅ๋‹ˆ๋‹ค.

 

 

 

์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ์™€ ๋ ˆ์ด์•„์›ƒ ์—ฐ๊ฒฐํ•˜๊ธฐ

  • ๋ทฐ(View) : ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ๋“ค์„ ํ†ต์นญ
  • ๋ทฐ์—์„œ ๋ฒ„ํŠผ ๊ฐ™์€ ์š”์†Œ๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๋ทฐ์™€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•จ
  • ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” findViewById๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์กฐ๊ธˆ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ฝ”ํ‹€๋ฆฐ ์ต์Šคํ…์…˜(Kotlin Extensions)์ด๋ผ๋Š” ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ์™”์Œ. ๊ทธ๋Ÿฌ๋‚˜, ์ฝ”ํ‹€๋ฆฐ ์ต์Šคํ…์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ตœ์‹  ๋ฒ„์ „์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ๋Š” ์‚ฌ์šฉ์„ ์ถ”์ฒœํ•˜์ง€ ์•Š์Œ
                  - ์ฝ”ํ‹€๋ฆฐ์—์„œ๋งŒ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ž๋ฐ”์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
                  - ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ ๋ทฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ
                  - ์–ด๋””์„œ๋‚˜ ๋ทฐ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ์ฐธ์กฐ๋กœ ์ธํ•ด ์•ฑ์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Œ
                    ์˜ˆ๋ฅผ ๋“ค์–ด activity_main.xml๊ณผ fragment_sub.xml์—์„œ ๋™์ผํ•˜๊ฒŒ button ์•„์ด๋””๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด
                    ์‹ค์ˆ˜๋กœ ๋‹ค๋ฅธ XML์˜ ์•„์ด๋””๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์•ฑ์ด ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ๋  ์ˆ˜๋„ ์žˆ์Œ
                  - ๋ชจ๋“ˆํ™”๋ฅผ ์ถ”์ฒœํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ฝ”ํ‹€๋ฆฐ ์ต์Šคํ…์…˜์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ฝ”๋“œ์—์„œ ๋ทฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅ
  • ๋”ฐ๋ผ์„œ ๋ทฐ ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ์™€ ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ถ”์ฒœ

 

๐Ÿ’ก ๋ทฐ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

 

(1) build.gradle(Module: app) ํŒŒ์ผ์— viewBinding ์„ค์ •์„ ์ถ”๊ฐ€

 

(2) ํŒŒ์ผ ์ƒ๋‹จ์— ๋‚˜ํƒ€๋‚˜๋Š” [Sync Now]๋ฅผ ํด๋ฆญํ•ด์„œ ์„ค์ •์„ ์ ์šฉ
(3) activity_main.xml ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์„ ์ž‘์„ฑ
(4) viewBinding์ด ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์„ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์ƒ์„ฑ

  • ์ž๋™๋ณ€ํ™˜ ๊ณต์‹: ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ๋ช…(์ฒซ ๊ธ€์ž์™€ ์–ธ๋”๋ฐ” ๋‹ค์Œ ์˜๋ฌธ์„ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜) + Binding
    ์˜ˆ) activity_main.xml = ActivityMainBinding

 

(5) MainActivity.kt ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ (์˜ˆ์‹œ)

package com.example.myfirstapplication
โ€‹
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.myfirstapplication.databinding.ActivityMainBinding
โ€‹
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}

 

 

[์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ]

 

val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
  • ๋ฐ”์ธ๋”ฉ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ทฐ์— ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘์—ˆ๋˜ ๋ฒ„ํŠผ์˜ id์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

 

binding.button.setOnClickListener { }
package com.example.myfirstapplication
โ€‹
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.myfirstapplication.databinding.ActivityMainBinding
โ€‹
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        binding.button.setOnClickListener { 
            
        }
    }
}
  • ๋ฒ„ํŠผ์˜ id์— ๋ฆฌ์Šค๋„ˆ(Listener)๋ฅผ ์„ค์ •
  • ๋ฆฌ์Šค๋„ˆ์˜ ์—ญํ• ์€ ๋ฒ„ํŠผ์„ ํด๋ฆญ ํ–ˆ์„ ๋•Œ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ๋™์ž‘์‹œํ‚ค๋Š” ๊ฒƒ

 

binding.button.setOnClickListener{
    binding.textView.text = "Hello Kotlin!!!" // ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด TextView์˜ ๋ฌธ๊ตฌ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
}
  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์˜€์„ ๋•Œ TextView์˜ ๋ฌธ๊ตฌ๋ฅผ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ

 

[์ตœ์ข… ์ฝ”๋“œ]

package com.example.myfirstapplication
โ€‹
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.myfirstapplication.databinding.ActivityMainBinding
โ€‹
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
โ€‹
        binding.button.setOnClickListener {
            binding.textView.text = "Hello Kotlin!!!"
        }
    }
}

Button์„ ๋ˆŒ๋ €์„ ๋•Œ ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ

 

 

์•ฑ ์‹คํ–‰ํ•˜๊ธฐ

  • ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ , ํ”Œ๋ ˆ์ด ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์‹คํ–‰

 

 


 

3 XML ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

 

  • LinearLayout, FrameLayout, RelativeLayout ์ปดํฌ๋„ŒํŠธ ํŠน์ง• ๋ฐ ์†์„ฑ ์ดํ•ด, ํ™œ์šฉ
  • ๋ ˆ์ด์•„์›ƒ, ์œ„์ ฏ, ๋ทฐ ์ดํ•ด

 

์•กํ‹ฐ๋น„ํ‹ฐ์™€ ์ธํ…ํŠธ

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ํ•œ ํ™”๋ฉด(ํŽ˜์ด์ง€)์€ ํ•˜๋‚˜์˜ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ๊ตฌ์„ฑ
  • ํ™”๋ฉด ์ „ํ™˜์€ ์ธํ…ํŠธ๋กœ ๊ตฌํ˜„

 

๋ฒ„ํŠผ ์ž‘๋™

// activity_main.xml
<Button
	android:text="๋„ค์ด๋ฒ„ ์ ‘์†ํ•˜๊ธฐ"
	android:onClick="onButton1Clicked" />
<Button
	android:text="์ „ํ™” ๊ฑธ๊ธฐ"
	android:onClick="onButton2Clicked" />


// MainActivity.kt
fun onButton1Clicked(View){
	val myIntent = Intent(Intent.ACTION_VIEW, uri.parse("http://m.naver.com"))
    startActivity(myIntent) // ์›น๋ทฐ๋ฅผ ๋„์šฐ๋Š” ์ธํ…ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ํ˜ธ์ถœ
}
fun onButton2Clicked(View){
	val myIntent2 = Intent(Intent.ACTION_VIEW, uri.parse("tel:010-1234-5678"))
    startActivity(myIntent2) // ์ „ํ™”๋ฅผ ๊ฑฐ๋Š” ์ธํ…ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ํ˜ธ์ถœ
}
  • ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ณ , onClick ์†์„ฑ์˜ ๊ฐ’์— ์›ํ•˜๋Š” ํ•จ์ˆ˜๋ช…์„ ์“ฐ๋ฉด ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋จ
  • ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ์— ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์™„๋ฃŒ
  • ์ฐธ๊ณ ๋กœ ์ž‘์„ฑ ๋„์ค‘ import๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด, ๊ฐ–๋‹ค๋Œ€๊ณ  ctrl + enterํ•˜๋ฉด ์ž๋™ ์ƒ์„ฑ
๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T