์ฒซ ๋ฒˆ์งธ Android ์•ฑ ๋งŒ๋“ค๊ธฐ

1. ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ปดํ“จํ„ฐ์— ์•„์ง Android ์ŠคํŠœ๋””์˜ค๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ๊ฐ€ Android ์ŠคํŠœ๋””์˜ค ์‹คํ–‰์— ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ(๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€ ํ•˜๋‹จ ์ฐธ๊ณ )์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ํ”„๋กœ์„ธ์Šค์— ๊ด€ํ•œ ์ž์„ธํ•œ ์•ˆ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Android ์ŠคํŠœ๋””์˜ค ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜ Codelab์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ด Codelab์—์„œ๋Š” Android ์ŠคํŠœ๋””์˜ค์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ฒซ ๋ฒˆ์งธ Android ์•ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Kotlin๊ณผ Jetpack Compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์„ ๋งž์ถค์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Android ์ŠคํŠœ๋””์˜ค๋Š” ์—…๋ฐ์ดํŠธ๋˜๊ณ  ๋•Œ์— ๋”ฐ๋ผ UI๋„ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ Android ์ŠคํŠœ๋””์˜ค๊ฐ€ ์ด Codelab์˜ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์š”๊ฑด

  • ๊ธฐ๋ณธ์ ์ธ Kotlin ์ง€์‹

ํ•„์š”ํ•œ ํ•ญ๋ชฉ

  • ์ตœ์‹  ๋ฒ„์ „์˜ Android ์ŠคํŠœ๋””์˜ค

ํ•™์Šตํ•  ๋‚ด์šฉ

  • Android ์ŠคํŠœ๋””์˜ค๋กœ Android ์•ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
  • Android ์ŠคํŠœ๋””์˜ค์˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋„๊ตฌ๋กœ ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Kotlin์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Jetpack Compose๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Jetpack Compose์˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ ์•ฑ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

๋นŒ๋“œํ•  ํ•ญ๋ชฉ

  • ์†Œ๊ฐœ๋ฅผ ๋งž์ถค์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์•ฑ

์ด Codelab์„ ์™„๋ฃŒํ•˜๋ฉด ์•ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(์ด๋ฆ„๋งŒ ๋งž์ถค์„ค์ •๋จ).

13957184d295b16f.png

ํ•„์š”ํ•œ ํ•ญ๋ชฉ

2. ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ

์ด Codelab์—์„œ๋Š” Android ์ŠคํŠœ๋””์˜ค์—์„œ ์ œ๊ณตํ•˜๋Š” Empty Activity ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ Android ์•ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Android ์ŠคํŠœ๋””์˜ค์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. Android ์ŠคํŠœ๋””์˜ค ์•„์ด์ฝ˜์„ ๋”๋ธ”ํด๋ฆญํ•˜์—ฌ Android ์ŠคํŠœ๋””์˜ค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

4853d32c0c91ae24.png

  1. Welcome to Android Studio ๋Œ€ํ™”์ƒ์ž์—์„œ New Project๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

687a108b17ba9b20.png

Android ์ŠคํŠœ๋””์˜ค์—์„œ ์ œ๊ณตํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ๋ชฉ๋ก์ด ํ‘œ์‹œ๋œ New Project ์ฐฝ์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค.

2411487f7f8d88c0.png

Android ์ŠคํŠœ๋””์˜ค์—์„œ ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์€ ํŠน์ • ์œ ํ˜•์˜ ์•ฑ์„ ์œ„ํ•œ ์ฒญ์‚ฌ์ง„์„ ์ œ๊ณตํ•˜๋Š” Android ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์€ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ  Android ์ŠคํŠœ๋””์˜ค์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ํ…œํ”Œ๋ฆฟ์—์„œ ์‹œ์ž‘ ์ฝ”๋“œ๊ฐ€ ์ œ๊ณต๋˜๋ฏ€๋กœ ๋” ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Phone and Tablet ํƒญ์ด ์„ ํƒ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Empty Activity ํ…œํ”Œ๋ฆฟ์„ ํด๋ฆญํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Empty Activity ํ…œํ”Œ๋ฆฟ์€ Compose ์•ฑ์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ ํ™”๋ฉด์ด ์žˆ๊ณ  "Hello Android!" ํ…์ŠคํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค์Œ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. New Project ๋Œ€ํ™”์ƒ์ž๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Name ํ•„๋“œ๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋ฉฐ ์ด Codelab์—์„œ๋Š” 'Greeting Card'๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Package name ํ•„๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๋Š” ํŒŒ์ผ ๊ตฌ์กฐ์—์„œ ํŒŒ์ผ์ด ๊ตฌ์„ฑ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ com.example.greetingcard๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

Save location ํ•„๋“œ๋„ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ํŒŒ์ผ์ด ์ €์žฅ๋˜๋Š” ์œ„์น˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ์˜ ์ €์žฅ ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•ด ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Minimum SDK ํ•„๋“œ์˜ ๋ฉ”๋‰ด์—์„œ API 24: Android 7.0(Nougat)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Minimum SDK๋Š” ์•ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Android์˜ ์ตœ์†Œ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

4b0786fccfc883fe.png

  1. ๋งˆ์นจ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์†Œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์ฐจ๋ฅผ ํ•œ ์ž” ๋“œ์‹œ๊ณ  ์™€๋„ ์ข‹์Šต๋‹ˆ๋‹ค. Android ์ŠคํŠœ๋””์˜ค๊ฐ€ ์„ค์ •๋˜๋Š” ๋™์•ˆ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„๊ณผ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด Android ์ŠคํŠœ๋””์˜ค์—์„œ ์•„์ง ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ด๋ฏธ์ง€๋Š” ํšŒ์ „ํ•˜๋Š” ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„๊ณผ ํ…์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์„ค์ •์ด ๋งŒ๋“ค์–ด์ง€๋ฉด ์ด์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด ์ด๋ฏธ์ง€๋Š” Gradle ๋™๊ธฐํ™” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  1. Android ์ŠคํŠœ๋””์˜ค์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๊ด€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ํฌํ•จ๋œ What's New ์ฐฝ์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋‹ซ์Šต๋‹ˆ๋‹ค.

c4b2b7748563ebb7.png

  1. Android ์ŠคํŠœ๋””์˜ค ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์—์„œ Split์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฝ”๋“œ์™€ ๋””์ž์ธ์„ ๋ชจ๋‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Code๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ฝ”๋“œ๋งŒ ๋ณด๊ฑฐ๋‚˜ Design์„ ํด๋ฆญํ•˜์—ฌ ๋””์ž์ธ๋งŒ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

b17a701425679ff1.png

Split์„ ๋ˆ„๋ฅด๋ฉด ๋‹ค์Œ ์„ธ ์˜์—ญ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

c24906abb54b261a.png

  • Project ๋ทฐ(1)๋Š” ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • Code ๋ทฐ(2)์—์„œ๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Design ๋ทฐ(3)์—์„œ๋Š” ์•ฑ์ด ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ๋ฏธ๋ฆฌ ๋ด…๋‹ˆ๋‹ค.

Design ๋ทฐ์—๋Š” ๋‹ค์Œ ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๋นˆ ์ฐฝ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ํ‘œ์‹œ๋œ ํ…์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Build & Refresh๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œํ•˜๋Š” ๋ฐ ๋‹ค์†Œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์™„๋ฃŒ๋˜๋ฉด ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— 'Hello Android!'๋ผ๋Š” ํ…์ŠคํŠธ ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋นˆ Compose ํ™œ๋™์—๋Š” ์ด ์•ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

a86077be9d06a909.png

3. ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ์ฐพ๊ธฐ

์ด ์„น์…˜์—์„œ๋Š” ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ฉด์„œ Android ์ŠคํŠœ๋””์˜ค๋ฅผ ๊ณ„์† ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

  1. Android ์ŠคํŠœ๋””์˜ค์—์„œ Project ํƒญ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Project ํƒญ์— ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ ๋ฐ ํด๋”๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•  ๋•Œ ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ com.example.greetingcard์˜€์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋ฅผ Project ํƒญ์—์„œ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ํด๋”์ž…๋‹ˆ๋‹ค. Android ์ŠคํŠœ๋””์˜ค๋Š” ํŒจํ‚ค์ง€ ์„ธํŠธ๋กœ ์ด๋ฃจ์–ด์ง„ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ Android ํƒญ์˜ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ Android๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

52051aa2a3038b89.png

์ด๋Š” ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ์˜ ํ‘œ์ค€ ๋ทฐ ๋ฐ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์—์„œ ์ž‘์—…ํ•  ํŒŒ์ผ์— ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Finder ๋‚˜ Windows Explorer์™€ ๊ฐ™์€ ํŒŒ์ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŒŒ์ผ์„ ํ™•์ธํ•˜๋ฉด ํŒŒ์ผ ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ๋งค์šฐ ๋‹ค๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  1. ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ Project Source Files๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ํŒŒ์ผ ๋ธŒ๋ผ์šฐ์ €์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

84dc993206449d28.png

  1. ์ด์ „ ๋ทฐ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜๋ ค๋ฉด Android๋ฅผ ๋‹ค์‹œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ๋Š” Android ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ตฌ์กฐ๊ฐ€ ์ด์ƒํ•ด ๋ณด์ด๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ Android ๋ทฐ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

4. ํ…์ŠคํŠธ ์—…๋ฐ์ดํŠธ

Android ์ŠคํŠœ๋””์˜ค๋ฅผ ์•Œ์•„๋ดค์œผ๋ฏ€๋กœ ์ด์ œ ์ธ์‚ฌ๋ง ์นด๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

MainActivity.kt ํŒŒ์ผ์˜ Code ๋ทฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ์—๋Š” ํŠนํžˆ onCreate() ๋ฐ setContent() ํ•จ์ˆ˜ ๋“ฑ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            GreetingCardTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting("Android")
                }
            }
        }
    }
}

onCreate() ํ•จ์ˆ˜๋Š” ์ด Android ์•ฑ์˜ ์ง„์ž…์ ์ด๋ฉฐ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. Kotlin ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” main() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์˜ ์ง„์ž…์ /์‹œ์ž‘์ ์ž…๋‹ˆ๋‹ค. Android ์•ฑ์—์„œ๋Š” onCreate() ํ•จ์ˆ˜๊ฐ€ ์ด ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

onCreate() ํ•จ์ˆ˜ ๋‚ด setContent() ํ•จ์ˆ˜๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. @Composable ์ฃผ์„์œผ๋กœ ํ‘œ์‹œ๋œ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” setContent() ํ•จ์ˆ˜ ๋˜๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์„์€ Jetpack Compose์—์„œ ์ด ํ•จ์ˆ˜๊ฐ€ UI๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  Kotlin ์ปดํŒŒ์ผ๋Ÿฌ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ, Greeting() ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Greeting() ํ•จ์ˆ˜๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์œ„์—๋Š” @Composable ์ฃผ์„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hello $name!",
        modifier = modifier
    )
}

์ด์ „์— ํ•จ์ˆ˜์— ๊ด€ํ•ด ์•Œ์•„๋ดค์ง€๋งŒ(๋ณต์Šต์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Kotlin์—์„œ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ codelab ์ฐธ๊ณ ) ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

178c1b8d480aefe2.png

    1. ํ•จ์ˆ˜ ์•ž์— @Composable ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    1. @Composable ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐ๋ฉ๋‹ˆ๋‹ค.
    1. @Composable ํ•จ์ˆ˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hello $name!",
        modifier = modifier
    )
}

ํ˜„์žฌ Greeting() ํ•จ์ˆ˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ ธ์™€ ๊ทธ ์‚ฌ์šฉ์ž์—๊ฒŒ Hello๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  1. 'Hello'๋ผ๊ณ  ํ•˜๋Š” ๋Œ€์‹  ์ž๊ธฐ ์†Œ๊ฐœ๋ฅผ ํ•˜๋„๋ก Greeting() ํ•จ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hi, my name is $name!",
        modifier = modifier
    )
}
  1. Android๊ฐ€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

34c74a1b980c177.png

์ข‹์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ ์ด๋ฆ„์ด ์•„๋‹Œ Android๋กœ ์†Œ๊ฐœ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ด๋ฆ„์œผ๋กœ ์†Œ๊ฐœํ•˜๋„๋ก ๋งž์ถค์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

GreetingPreview() ํ•จ์ˆ˜๋Š” ์ „์ฒด ์•ฑ์„ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ์ปดํฌ์ €๋ธ”์ด ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ปดํฌ์ €๋ธ” ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด @Composable ๋ฐ @Preview๋กœ ์ฃผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. @Preview ์ฃผ์„์€ ์ด ์ปดํฌ์ €๋ธ”์„ ์ด ํŒŒ์ผ์˜ ๋””์ž์ธ ๋ทฐ์— ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ  Android ์ŠคํŠœ๋””์˜ค์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

@Preview ์ฃผ์„์ด showBackground๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. showBackground๊ฐ€ true๋กœ ์„ค์ •๋˜๋ฉด ์ปดํฌ์ €๋ธ” ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— ๋ฐฐ๊ฒฝ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

Android ์ŠคํŠœ๋””์˜ค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽธ์ง‘๊ธฐ์— ๋ฐ์€ ํ…Œ๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ showBackground = true์™€ showBackground = false ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ ์˜ˆ๋Š” ์ด๋Ÿฌํ•œ ์ฐจ์ด๊ฐ€ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ ํฐ์ƒ‰ ๋ฐฐ๊ฒฝ์ด true๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

showBackground = true

showBackground = false

  1. ์ด๋ฆ„์œผ๋กœ GreetingPreview() ํ•จ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งž์ถค์„ค์ •๋œ ์ธ์‚ฌ๋ง ์นด๋“œ๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์—ฌ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    GreetingCardTheme {
        Greeting("Meghan")
    }
}

9703ef244f8ee16c.png

5. ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ ๋ณ€๊ฒฝ

์ด์ œ ์†Œ๊ฐœ ํ…์ŠคํŠธ๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ ์•ฝ๊ฐ„ ์ง€๋ฃจํ•ฉ๋‹ˆ๋‹ค. ์ด ์„น์…˜์—์„œ๋Š” ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

์†Œ๊ฐœ์˜ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜๋ ค๋ฉด ํ…์ŠคํŠธ๋ฅผ Surface๋กœ ๋‘˜๋Ÿฌ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. Surface๋Š” ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์ด๋‚˜ ํ…Œ๋‘๋ฆฌ์™€ ๊ฐ™์€ ๋ชจ์–‘์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” UI ์„น์…˜์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.

  1. Surface๋กœ ํ…์ŠคํŠธ๋ฅผ ๋‘˜๋Ÿฌ์‹ธ๋ ค๋ฉด ํ…์ŠคํŠธ ์ค„์„ ๊ฐ•์กฐํ‘œ์‹œํ•˜๊ณ  Windows์˜ ๊ฒฝ์šฐ Alt+Enter, Mac์˜ ๊ฒฝ์šฐ Option+Enter๋ฅผ ๋ˆ„๋ฅธ ํ›„ Surround with widget์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

220f9c42667a9595.png

  1. Surround with Container๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

f5258fe61ffc94fb.png

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” Box์ด์ง€๋งŒ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Box ๋ ˆ์ด์•„์›ƒ์€ ์ด ๊ณผ์ •์˜ ํ›„๋ฐ˜๋ถ€์— ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

85e695291c03dcfc.png

  1. Box๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋Œ€์‹  Surface()๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Surface() {
        Text(
            text = "Hi, my name is $name!",
            modifier = modifier
        )
    }
}
  1. Surface ์ปจํ…Œ์ด๋„ˆ์— color ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Color๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Surface(color = Color) {
        Text(
            text = "Hi, my name is $name!",
            modifier = modifier
        )
    }
}
  1. Color๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ ์ด๋Š” Android ์ŠคํŠœ๋””์˜ค์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด import ๋ฌธ์ด ์žˆ๋Š” ํŒŒ์ผ์˜ ๋งจ ์œ„๋กœ ์Šคํฌ๋กคํ•˜์—ฌ ์  3๊ฐœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

80b6219d24f04365.png

  1. imports ๋ฌธ ๋ชฉ๋ก ์•„๋ž˜์— ๋‹ค์Œ ๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
import androidx.compose.ui.graphics.Color

์™„์„ฑ๋œ import ๋ฌธ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.greetingcard.ui.theme.GreetingCardTheme
import androidx.compose.ui.graphics.Color
  1. ์ฝ”๋“œ์—์„œ import ๋ฌธ์„ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ๊ณ„์† ๋‚˜์—ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import ๋ฌธ์€ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์ƒ๋‹จ ํˆด๋ฐ”์—์„œ Help๋ฅผ ๋ˆ„๋ฅด๊ณ  Optimize Imports๋ฅผ ์ž…๋ ฅํ•œ ๋‹ค์Œ Optimize Imports๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

92241239038c774a.png

๋ฉ”๋‰ด์—์„œ Code > Optimize Imports๋ฅผ ์„ ํƒํ•˜์—ฌ Optimize Imports๋ฅผ ๋ฐ”๋กœ ์—ด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 'Help'์˜ ๊ฒ€์ƒ‰ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋‰ด ํ•ญ๋ชฉ์˜ ์œ„์น˜๊ฐ€ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์„ ๋•Œ ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™„์„ฑ๋œ import ๋ฌธ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import com.example.greetingcard.ui.theme.GreetingCardTheme
  1. Surface ๊ด„ํ˜ธ ์•ˆ์— ์ž…๋ ฅํ•œ Color๊ฐ€ ๋นจ๊ฐ„์ƒ‰์—์„œ ๋นจ๊ฐ„์ƒ‰ ๋ฐ‘์ค„๋กœ ๋ฐ”๋€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด Color ๋’ค์— ๋งˆ์นจํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ƒ‰์ƒ ์˜ต์…˜์„ ๋ณด์—ฌ์ฃผ๋Š” ํŒ์—…์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” Android ์ŠคํŠœ๋””์˜ค์˜ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ, ์ง€๋Šฅ์ ์ด๋ฉฐ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ‰์ƒ์„ ์ง€์ •ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด๋ฅผ ์ธ์‹ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ƒ‰์ƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

3a709cb72da0f83d.png

  1. ๋…ธ์ถœ ์˜์—ญ ์ƒ‰์ƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด Codelab์—์„œ๋Š” Cyan์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ข‹์•„ํ•˜๋Š” ์ƒ‰์ƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
   Surface(color = Color.Cyan) {
       Text(
           text = "Hi, my name is $name!",
           modifier = modifier
       )
   }
}
  1. ์—…๋ฐ์ดํŠธ๋œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

217a09ca55b503f8.png

6. ํŒจ๋”ฉ ์ถ”๊ฐ€

ํ…์ŠคํŠธ์— ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ…์ŠคํŠธ ์ฃผ์œ„์— ๊ณต๋ฐฑ(ํŒจ๋”ฉ)์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Modifier๋Š” ์ปดํฌ์ €๋ธ”์„ ๊ฐ•ํ™”ํ•˜๊ฑฐ๋‚˜ ์žฅ์‹ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ์ˆ˜์ •์ž๋Š” padding ์ˆ˜์ •์ž์ด๋ฉฐ ์ด๋Š” ์š”์†Œ ์ฃผ์œ„์— ๊ณต๋ฐฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ…์ŠคํŠธ ์ฃผ์œ„์— ๊ณต๋ฐฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Modifier.padding() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์ปดํฌ์ €๋ธ”์—๋Š” Modifier ์œ ํ˜•์˜ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฒซ ๋ฒˆ์งธ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. modifier์— 24.dp ํฌ๊ธฐ๋กœ ํŒจ๋”ฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Surface(color = Color.Cyan) {
        Text(
            text = "Hi, my name is $name!",
            modifier = modifier.padding(24.dp)
        )
    }
}
  1. import ๋ฌธ ์„น์…˜์— ์•„๋ž˜์˜ import๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Optimize Imports๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ import ๋ฌธ์„ ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์„ธ์š”.

import androidx.compose.ui.unit.dp
import androidx.compose.foundation.layout.padding

2c09be85535277e9.png

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค. Compose์—์„œ ์ฒซ ๋ฒˆ์งธ Android ์•ฑ์„ ๋นŒ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์‰ฝ์ง€ ์•Š์€ ์ž‘์—…์ธ๋ฐ ์ž˜ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ๋‚ด์–ด ๋‹ค์–‘ํ•œ ์ƒ‰์ƒ๊ณผ ํ…์ŠคํŠธ๋ฅผ ์ ์šฉํ•ด ๋ณด๋ฉด์„œ ์ž˜ ์ตํžˆ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

7. ์†”๋ฃจ์…˜ ์ฝ”๋“œ ๊ฒ€ํ† 

๊ฒ€ํ† ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ

package com.example.greetingcard

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.greetingcard.ui.theme.GreetingCardTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            GreetingCardTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting("Android")
                }
            }
        }
    }
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Surface(color = Color.Cyan) {
        Text(
            text = "Hi, my name is $name!",
            modifier = modifier.padding(24.dp)
        )
    }
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    GreetingCardTheme {
        Greeting("Meghan")
    }
}

8. ๊ฒฐ๋ก 

Android ์ŠคํŠœ๋””์˜ค์— ๊ด€ํ•ด ์•Œ์•„๋ณด๊ณ  Compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒซ Android ์•ฑ์„ ๋นŒ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค.

์ด Codelab์€ Compose ์‚ฌ์šฉ ์‹œ ์•Œ์•„์•ผ ํ•˜๋Š” Android ๊ธฐ๋ณธ์‚ฌํ•ญ ๊ณผ์ •์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋‚˜ ์‹ค์ œ ๊ธฐ๊ธฐ์—์„œ ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ์ด ๊ฐœ๋ฐœ์ž ๊ณผ์ •์˜ ๋‹ค์Œ Codelab์„ ํ™•์ธํ•˜์„ธ์š”.

์š”์•ฝ

  • ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด Android ์ŠคํŠœ๋””์˜ค๋ฅผ ์—ด๊ณ  New Project > Empty Activity > Next๋ฅผ ํด๋ฆญํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ์ž…๋ ฅํ•œ ๋‹ค์Œ ์„ค์ •์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ์ด ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด Preview ์ฐฝ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐ๋˜๋ฉฐ ํ•จ์ˆ˜ ์•ž์— @Composable ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ณ  @Composable ํ•จ์ˆ˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Modifier๋Š” ์ปดํฌ์ €๋ธ”์„ ๊ฐ•ํ™”ํ•˜๊ฑฐ๋‚˜ ์žฅ์‹ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ