[Android TIL] 240411 (์ˆ™๋ จ ๊ฐ•์˜ ์ˆ˜๊ฐ•, ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ๊ณผ์ œ ๊ตฌํ˜„, ๋กœ๊ทธ์ธ ๊ณผ์ œ ํ•ด์„ค, ๋ฒ ์ด์ง๋ฐ˜ 2์ฃผ์ฐจ ์ˆ˜๊ฐ•)
๋ฐ˜์‘ํ˜•

 

 

 



 

 

๐ŸŒฑ Today I Learned (์ง‘์ค‘์‹œ๊ฐ„ : 7์‹œ๊ฐ„ 35๋ถ„)

  1. (9:30 ~ 9:50 / 20๋ถ„) TIL ์ •๋ฆฌ ๋ฐ ์‹œ์ž‘ ์ค€๋น„
  2. (10:00 ~ 11:00 / 1์‹œ๊ฐ„) ํŒ€ ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ
  3. (11:00 ~ 12:25 / 1์‹œ๊ฐ„ 25๋ถ„) ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด
  4. (12:25 ~ 12:45 / 20๋ถ„) ๊ฐ•์˜ ์ˆ˜๊ฐ•, ํ”„๋ž˜๊ทธ๋จผํŠธ ์‹ค์Šต
  5. (19:00 ~ 20:30 / 1์‹œ๊ฐ„ 30๋ถ„) ๊ฐ•์˜ ์ˆ˜๊ฐ•, ํ”„๋ž˜๊ทธ๋จผํŠธ ์‹ค์Šต
  6. (20:30 ~ 21:00 / 30๋ถ„) ํŒ€ ๋ฐ์ผ๋ฆฌ ํšŒ๊ณ 
  7. (21:00 ~ 22:30 / 1์‹œ๊ฐ„ 30๋ถ„) ์ด์ „ ๋กœ๊ทธ์ธ ๊ณผ์ œ ํ”ผ๋“œ๋ฐฑ ์ •๋ฆฌ ๋ฐ ํ•ด์„ค ๊ฐ•์˜
  8. (22:30 ~ 23:30 / 1์‹œ๊ฐ„) ๋ฒ ์ด์ง๋ฐ˜ ๊ฐ•์˜ ์ˆ˜๊ฐ•

*** ์ ์‹ฌ 13:00 ~ 14:00 / ์ €๋… 18:00 ~ 19:00 ์ œ์™ธ

โ€‹

๐Ÿ“… ์ด๋ฒˆ ์ฃผ ๋ชฉํ‘œ

  • [V] ์ˆ™๋ จ ๊ฐ•์˜ ๋‹ค ๋“ฃ๊ธฐ
  • [  ] ์Šคํƒ ๋‹ค๋“œ 2์ฃผ์ฐจ ์‹ฌํ™” ๊ตฌํ˜„ : ์ˆ™๋ จ ๊ฐ•์˜ ์ฒดํ™”(fragment, fragment ๊ฐ„์˜ ๋ฐ์ดํ„ฐ์ „๋‹ฌ)
  • [  ] ์ˆ™๋ จ ๊ฐœ์ธ ๊ณผ์ œ ํ•„์ˆ˜ ๊ตฌํ˜„ : ์ˆ™๋ จ ๊ฐ•์˜ ์ฒดํ™”(notification, dialog, recyclerview, fragment ์ข…ํ•ฉ)
  • [  ] ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ๋ฐ€๋ฆฐ ๊ฐ•์˜, ๊ณผ์ œ ๋“ฃ๊ธฐ
  • [  ] ์ •์ฐฝ๊ฒฝ ๋‚ด์šฉ ์ •๋ฆฌ
  • [V] ์ž…๋ฌธ ๊ฐœ์ธ ๊ณผ์ œ ํ•ด์„ค ํ•™์Šต
  • [  ] ๋ฒ ์ด์ง๋ฐ˜ ๊ฐ•์˜ 4์ฃผ์ฐจ๊นŒ์ง€
  • [  ] ๋ฐ€๋ฆฌ์˜ ์„œ์žฌ ์•ˆ๋“œ๋กœ์ด๋“œ ์„œ์  ์ง„๋„ ๋ถ€๋ถ„๊นŒ์ง€ ๋‹ค ํ›‘๊ธฐ
  • [  ] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ง‘์ค‘ ์ฝ”๋“œ์นดํƒ€
  • [  ] ๋งํฌ ์ˆ˜๊ฐ•
  • [  ] (์‹ฌํ™”) KIA ๊ฐœ๋… ํ›‘๊ธฐ
  • [  ] (์‹ฌํ™”) Android Developer ์ฝ๊ธฐ
  • [  ] (์‹ฌํ™”) ๊ฐœ์ธํ”„๋กœ์ ํŠธ UI ๊ตฌํ˜„
  • [  ] (์‹ฌํ™”) ์ €๋ฒˆ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋œฏ์–ด๋ณด๊ธฐ

โ€‹

 

 

 

 

 

 

 

1. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด (3์ง„๋ฒ• ๋’ค์ง‘๊ธฐ)

 

 

[Kotlin] 3์ง„๋ฒ• ๋’ค์ง‘๊ธฐ (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜) : toInt(n), toString(n), .plus(), .add()

๋ฌธ์ œ https://school.programmers.co.kr/learn/courses/30/lessons/68935 ์ ‘๊ทผ 10์ง„๋ฒ• -> 3์ง„๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ -> ๋’ค์ง‘๊ธฐ -> ๋‹ค์‹œ 10์ง„๋ฒ•์œผ๋กœ ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ๋ฌธ์ œ๋‹ค. 10์ง„์ˆ˜ 240์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž. 10์ง„์ˆ˜ 240์„ 3์ง„๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ• 

limheejin.tistory.com

 

  • Array์™€ List์—์„œ์˜ plus/add ์ฐจ์ด๋ฅผ ๋ชฐ๋ผ์„œ ์ž˜๋ชป ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
  • toInt()์™€ toString()์„ ์ด์šฉํ•˜์—ฌ ์ง„๋ฒ• ๋ณ€ํ™˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฒ˜์Œ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.
  • ๋‹ค๋งŒ toInt() toString()์„ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•๋ณด๋‹ค, ๋‚ด๊ฐ€ ๊ธธ๊ฒŒ ์ ์€ ์ฝ”๋“œ์˜ ์‹คํ–‰์†๋„๊ฐ€ ๋” ๋น ๋ฅธ ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค. ์ฝ”๋“œ์˜ ๊ธธ์ด์™€ ๊ด€๊ณ„์—†์ด ๋กœ์ง์— ๋”ฐ๋ผ ์‹คํ–‰์†๋„๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ•˜๊ณ  ์ด์œ ๋ฅผ ์ฐพ๊ณ  ์‹ถ์—ˆ๋‹ค.

 

 

 

 

 

 

2. ๊ฐ•์˜ ์ˆ˜๊ฐ• ๋ฐ ๊ตฌํ˜„ ์ค‘์˜ ๊ถ๊ธˆ์ฆ

 

๐Ÿ’กConstraintLayout ์•ˆ์—์„œ์˜ ๋น„์œจ ์„ค์ •

  • Constraint Layout์—์„œ ํ™”๋ฉด ๋น„์œจ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด layout_constraintHeight_percent๋ฅผ ์ด์šฉ
    - ์ด ๊ฒฝ์šฐ layout_height๊ฐ’์€ 0dp๋กœ ์„ค์ •ํ•ด์•ผ constraint์— ๋งค์น˜๋˜์–ด ๊ตฌ์กฐ๊ฐ€ ์žกํžŒ๋‹ค.
    - ๋ฐ˜๋Œ€๋กœ constraintWidth_percent๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ layout_width๊ฐ’์€ 0dp๋กœ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.
  • ํ•ด๋‹น ๋‚ด์šฉ์„ ์ €๋ฒˆ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๋ฉด์„œ๋„ ๋ฐฐ์› ์—ˆ๋Š”๋ฐ, 1์ดˆ๋„ ๊ณ ๋ฏผ ์•Š๊ณ  ์ฒดํ™”๋  ๋•Œ๊นŒ์ง€๋Š” ์—ฐ์Šต์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.
  • ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ: https://yang-droid.tistory.com/9

 

๐Ÿ’กCompanion Object?

class TestClass {
    companion object {
        val name = "TestClass"
        fun method() {}
    }
}

fun main() {
    TestClass.name
    TestClass.Companion.name
    TestClass.method()
    TestClass.Companion.method()
}
  • ํ”„๋ž˜๊ทธ๋จผํŠธ์—์„œ ํ”„๋ž˜๊ทธ๋จผํŠธ๋กœ ๊ฐ’์„ ๋„˜๊ฒจ ๋ฐ›์„๋•Œ, companion object๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๋‹ค.
    ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ํ•ด๋‹น ๊ฐœ๋…์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ดํ•ด ์—†์ด ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ์žˆ๋‹ค.
  • companion object์™€ ๊ด€๋ จํ•˜์—ฌ ์ž๋ฐ” static๊ณผ์˜ ์—ฐ๊ด€์„ฑ, ์‹ค์ œ ์–ด๋Š ์ผ€์ด์Šค์—์„œ ์ •ํ™•ํžˆ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ํƒ๊ตฌ๊ฐ€ ํ•„์š”ํ•ด๋ณด์˜€๋‹ค. ์ฝ”ํ‹€๋ฆฐ์˜ object ํ‚ค์›Œ๋“œ๋Š” ์ž๋ฐ”์˜ static ํ‚ค์›Œ๋“œ์™€ new ํ‚ค์›Œ๋“œ๋ฅผ ๋Œ€์‹ ํ•œ๋‹ค. ํด๋ž˜์Šค ์ •๋ณด ์ ์žฌ์™€ ๊ฐ์ฒด ์„ ์–ธ์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • object ํ‚ค์›Œ๋“œ์™€์˜ ์ฐจ์ด์ ์€
    1. 'ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์žˆ๋Š” object'๋ฅผ ๊ตณํžŒ ํ˜•ํƒœ
    2. companion object ๋‚ด๋ถ€์— ์žˆ๋Š” ๋ณ€์ˆ˜,๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ด๋„๋ก ๋ˆˆ์†์ž„ํ•œ ๊ฒƒ
  • ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ : (๋งํฌ1) (๋งํฌ2)

 

 

 

 

 

 

3. ์ด์ „ ๋ฐœ์ œ ๊ฐœ์ธ๊ณผ์ œ ํ”ผ๋“œ๋ฐฑ ๋ฐ ํ•ด์„ค

 

๐Ÿ’กํ”ผ๋“œ๋ฐฑ ๋‚ด์šฉ ์ •๋ฆฌ

COMPONENT TYPE ABBREVIATIONS (This list shows two letters which is plenty)

Frame Layout: fl
Linear Layout: ll
Table Layout: tl
Table Row: tr
Grid Layout: gl
Relative Layout: rl
Text View: tv
Button: bt
Check Box: cb
Switch: sw
Toggle Button: tb
Image Button: ib
Image View: iv
Edit Text: et
Radio Group: rg
List View: lv
Grid View: gv
Fragment: fr
  • ๋ณดํ†ต xmlํŒŒ์ผ์—์„œ ์ปดํฌ๋„ŒํŠธ ํƒ€์ž… ์ปจ๋ฒค์…˜์— ๋”ฐ๋ผ btn_back, ll_linearlayout ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋ช…๋ช…์„ ํ–ˆ์—ˆ๋‹ค.
    (์ฝ”๋“œ ์ปจ๋ฒค์…˜์— ๋Œ€ํ•œ ์ •๋ณด: ๋งํฌ)
  • ๋‹ค๋งŒ ์ด๋Ÿฐ xml ์ปดํฌ๋„ŒํŠธ์˜ ์•„์ด๋””๋ฅผ ๊ฐ€์ ธ์™€ findViewById๋กœ ๋ณ€์ˆ˜/์ƒ์ˆ˜์— ๋„ฃ์–ด์ค„ ๋•Œ๋Š” xml ์ปดํฌ๋„ŒํŠธ ํƒ€์ž… ์ปจ๋ฒค์…˜์œผ๋กœ ๋ช…๋ช…ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, val btnBack์ฒ˜๋Ÿผ ์นด๋ฉœ์ผ€์ด์Šค๋กœ ๋ช…๋ช…ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
    ์‚ฌ์‹ค ๋‚˜์ค‘์—๋Š” ๋Œ€๋ถ€๋ถ„ ๋ทฐ๋ฐ”์ธ๋”ฉ์„ ์ด์šฉํ•  ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธด ํ•˜์ง€๋งŒ, ๊ฐ„ํ˜น ์ด์ „์— ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ findViewByID๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์œผ๋‹ˆ ์•Œ์•„๋†“๊ธด ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.
  • ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค.
    - Toast.makeText(this.applicationContext,"ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€", Toast.LENGTH_SHORT).show()
    ๊ทธ๋Ÿฐ๋ฐ this.applicationContext๊ฐ€ ์•„๋‹Œ this๋กœ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.
    1. this: this๋Š” ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋”ฐ๋ผ์„œ this๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.
      ์ด ๊ฒฝ์šฐ, ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€๊ฐ€ ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ๊ด€๋ จ๋œ ์ปจํ…์ŠคํŠธ์—์„œ ๋ณด์—ฌ์ง„๋‹ค.
    2. this.applicationContext: this.applicationContext๋Š” ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ์™€๋Š” ๋…๋ฆฝ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋”ฐ๋ผ์„œ this.applicationContext๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•กํ‹ฐ๋น„ํ‹ฐ์™€๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด์—ฌ์ง„๋‹ค.
    ํ†ต์ƒ์ ์œผ๋กœ, ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ๋•Œ๋Š” this๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ผ๋ฐ˜์ ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€๋Š” ์ฃผ๋กœ ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ๊ด€๋ จ๋œ ๋™์ž‘์„ ์•Œ๋ ค์ฃผ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” this.applicationContext๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž๋™ ์ •๋ ฌ๊ณผ ํด๋ฆฐ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋Š”, ๊ฐœ์ธ๊ณผ์ œ ์ดํ›„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ๋„ ๋งŽ์ด ๋Š๊ผˆ๋˜ ๋ถ€๋ถ„์ด๋‹ค.
    ctrl + alt + l์„ ์Šต๊ด€ํ™”ํ•˜์ž.

 

 

๐Ÿ’ก๊ณผ์ œ ํ•ด์„ค

  • ์•ž์œผ๋ก  ํ•˜๋“œ์ฝ”๋”ฉ ์—†์ด ์›ฌ๋งŒํ•˜๋ฉด strings.xml๊ณผ colors.xml ์„ ์‚ฌ์šฉํ•˜์ž. ๋น„๋‹จ ๋ฒˆ์—ญ ์ž‘์—… ๋ฟ๋งŒ์•„๋‹ˆ๋ผ, ๋””์ž์ธ ์š”์†Œ 50๊ฐœ์— ๊ฐ๊ฐ #FA30F9๊ณผ ๊ฐ™์€ RGB ์ฝ”๋“œ๊ฐ’์œผ๋กœ ์ž…๋ ฅํ•ด๋†“๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ์ˆ˜์ •ํ•˜๊ณ ์ž ํ•˜๋ฉด ๋‹ต๋„ ์—†๋‹ค.
  • ํšŒ์›๊ฐ€์ž…์—์„œ ๋กœ๊ทธ์ธ์œผ๋กœ ๋‹ค์‹œ ๋ณด๋‚ด์งˆ ๋•Œ, ๋‚œ ๊ทธ๋ƒฅ finish()๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ํŠœํ„ฐ๋‹˜์€ if(!isFinishing) finish() ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ํ˜น์‹œ๋ผ๋„ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๋‹ค๋ฅธ ์š”์ธ์— ์˜ํ•ด ์ข…๋ฃŒ์ค‘์ผ ๋•Œ finish()๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋˜๋ฉด ์•ˆ๋˜๊ธฐ์— ํ•œ ๋ฒˆ ๋” ํ™•์ธ์ž‘์—…์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด๋ผ ํ•œ๋‹ค.

 

activityResultLauncher = registerForActivityResult(
	ActivityResultContracts.StartActivityForResult()){
		if (it.resultCode == RESULT_OK) {
			val user_id = it.data?.getStringExtra("id") ?: ""
			...
	}
}
  • ๋˜ํ•œ setResult(RESULT_OK, intent)๋ฅผ ํšŒ์›๊ฐ€์ž…์—์„œ ๋ณด๋‚ผ ๋•Œ ์‹คํ–‰ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ๋‹ค์‹œ ๋ฐ›์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด if๋ฌธ์œผ๋กœ resultCode๊ฐ€ RESULT_OK๊ฐ€ ๋งž๋Š”์ง€ ํ•œ ๋ฒˆ ๋” ํ™•์ธํ•˜์…จ๋‹ค.

 

๋‚ด๊ฐ€ ํ•œ ์ด๋ฏธ์ง€ ๋žœ๋ค ๊ตฌํ˜„

val profilePic = findViewById<ImageView>(R.id.img_profile)
val img : IntArray = intArrayOf(R.drawable.pic1, R.drawable.pic2,...)
val random = Random()
val num = random.nextInt(img.size) 
// num ๋ณ€์ˆ˜์— 0๋ถ€ํ„ฐ (images์˜ ๊ธธ์ด - 1) ๋งŒํผ ์ˆซ์ž ์ค‘ ๋ฌด์ž‘์œ„ Int ์ €์žฅ
profilePic.setImageResource(img[num]) 
// ๋žœ๋ค์œผ๋กœ ๋ฝ‘์€ ์ˆซ์ž์˜ ์‚ฌ์ง„์„ ๋„ฃ์Œ
ํŠœํ„ฐ๋‹˜์ด ํ•˜์‹  ๋žœ๋ค ๊ตฌํ˜„

val iv_logo = findViewById<ImageView>(R.id.iv_home_logo)

val id = when ((1..6).random()) {
    1 -> R.drawable.ca1
    2 -> R.drawable.ca2
    3 -> R.drawable.ca3
    4 -> R.drawable.ca4
    5 -> R.drawable.ca5
    else -> R.drawable.ca1
}
        
iv_logo.setImageDrawable(ResourcesCompat.getDrawable(resources, id, null))
  • ์ด๋ฏธ์ง€ ๋žœ๋ค ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋„ ์กฐ๊ธˆ ๋‹ฌ๋ž๋‹ค.
  • when ๋‚ด์—์„œ ๊ทธ๋ƒฅ .random()์„ ๋ฐ”๋กœ ์จ์„œ ์ด๋ฏธ์ง€๋ฅผ ๊บผ๋‚ด์คฌ๋‹ค. ์—„์ฒญ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

selector_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true">
    <shape android:shape="rectangle">
        <solid android:color="@color/colorAccent"/>
        <corners android:radius="10dp"/>
    </shape>
</item>

<item>
    <shape android:shape="rectangle">
        <solid android:color="@color/yellow"/>
        <corners android:radius="10dp"/>
    </shape>
</item>

</selector>



selector_pic.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/sad" android:state_pressed="true"/>
<item android:drawable="@drawable/happy" android:state_focused="true"/>
<item android:drawable="@drawable/happy"/>

</selector>
  • ํ•ด์„ค ์˜์ƒ์ด ๊ธฐ์กด์— ์ฃผ์–ด์ง„ ๊ณผ์ œ๋ž‘ ์กฐ๊ธˆ ๋‹ฌ๋ž๋Š”๋ฐ, ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ƒ‰๊น”์ด ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋‚ด์šฉ๋„ ์žˆ์—ˆ๋‹ค.
  • (1) ๋ฒ„ํŠผ ์˜์—ญ์„ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋ ˆ์ด์•„์›ƒ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋ฅผ selector_button.xml ํŒŒ์ผ๋กœ ์ง€์ •
    (2) item์„ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ„๊ณ , ํ•œ ์•„์ดํ…œ์€ <item android:state_pressed="true">๋กœ ๋ˆŒ๋ ธ์„ ๋•Œ์˜ ์ƒ‰๊น”์„ ์ง€์ •ํ•œ๋‹ค.
    (+) ์ผ๋ฐ˜ ์‚ฌ์ง„์ด๋‚˜ ์•„์ด์ฝ˜์˜ ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•˜๊ฒŒ xmlํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์ƒํƒœ๋ณ„๋กœ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

4. ๋ฒ ์ด์ง๋ฐ˜ 2์ฃผ์ฐจ ๊ฐ•์˜ ์—ผํƒ

  • ๊ฐœ์ธ์ ์ธ ์š•์‹ฌ์œผ๋กœ ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ์ด์™ธ์˜ ๋ฒ ์ด์ง๋ฐ˜ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜์˜€๋‹ค.

 

๐Ÿ’ก ๋ฒ ์ด์ง๋ฐ˜ 2์ฃผ์ฐจ

  • ๋ทฐ๋ฐ”์ธ๋”ฉ์ด ๋“ฑ์žฅํ•œ์ง€๋„ ๊ต‰์žฅํžˆ ์˜ค๋ž˜ ๋˜์—ˆ๋‹ค. findViewbyID๋ฐฉ์‹์€ ๊ฑฐ์˜ 10๋…„๋„ ๋„˜์€ ๊ตฌ๋ฆฐ ๋ฐฉ์‹์ด๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ์ชผ๊ฐœ๋Š” ๊ฒƒ๊ณผ ํด๋ฆฐ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์žˆ์—ˆ๋‹ค. ์›ฌ๋งŒํ•˜๋ฉด ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ)๋ฅผ ๋งŽ์ด ๋งŒ๋“ค๊ณ , ์กฐ๊ฑด๋ฌธ ์•ˆ์˜ ์กฐ๊ฑด๋„ ๊ธธ์–ด์ง€๋ฉด ๋ณ€์ˆ˜๋กœ ์ชผ๊ฐœ์„œ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๊น”๋”ํ•˜๊ฒŒ ํ•œ๋‹ค. ๊ฐ์ข… ๊ฐœ๋ฐœ ์„œ์ ์—๋„ ์›ฌ๋งŒํ•˜๋ฉด ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŽ์ด ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.  ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ๋™์ž‘์„ ์ชผ๊ฐœ๋ผ.
  • ํ˜„์—…์—์„œ๋„ ์ฝ”๋“œ๋ฅผ ์™ธ์›Œ์„œ ์น˜๋Š” ์‚ฌ๋žŒ์€ ์—†๋‹ค. ํ˜„์—… ๊ฐœ๋ฐœ์ž ๋˜ํ•œ ๋ทฐ๋ฐ”์ธ๋”ฉ ๊ตฌํ˜„์„ ์œ„ํ•œ 4์ค„์งœ๋ฆฌ ์ฝ”๋“œ์กฐ์ฐจ๋„ ๋ณดํ†ต ์•ˆ๋“œ๋กœ์ด๋“œ ๋””๋ฒจ๋กœํผ ํ™ˆํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•˜์—ฌ ์ ์šฉํ•œ๋‹ค.
  • ์ง€์—ฐ์ดˆ๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ณ€์ˆ˜๋ช…? = null ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋„ ์„ค๋ช…์ด ์žˆ์—ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด private var job: Job? = null ๋กœ ์„ ์–ธ๋œ ๊ฒƒ์„ lateinit var๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฌ๋ฉด, ์žฌ์‹œ์ž‘์‹œ job?.cancel()์ด๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ดํ›„์— job = ~ ์ดˆ๊ธฐํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
  • ๋น„์šฉ์ด ํฌ๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…๋“ค์€ lazy๋กœ ์„ ์–ธ๋˜๋ฉด ์•ˆ ๋œ๋‹ค. 
  • ๋ณดํ†ต setupButton()๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  :๋กœ ๋ฆฌํ„ด๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๋•Œ, ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ : Unit ํƒ€์ž…์ด ์ˆจ๊ฒจ์ ธ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”์˜ void๋ž‘ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
    (์‹ค์ œ๋กœ ์ž…๋ ฅํ•˜๋ฉด redundant type = ๋ถˆํ•„์š”ํ•œ ํƒ€์ž…์œผ๋กœ ์ง€์šฐ๋ผ๊ณ  ๋œธ)
  • Add names to call arguments(Named Parameter)๋ฅผ ์Šต๊ด€ํ™”ํ•ด๋ผ.
    ์˜ˆ๋ฅผ ๋“ค์–ด private fun add(a: Int, b: Int){} ๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์„ ๋•Œ, add(10, 20)์ด๋ผ๊ณ  ์ž‘์„ฑํ•˜๊ณ  alt+enter๋ฅผ ๋ˆ„๋ฅด๋ฉด Add names to call arguments๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด๋ฅผ ํด๋ฆญํ•˜๋ฉด add(a=10, b=20)๊ณผ ๊ฐ™์ด ์•Œ์•„์„œ ์ด๋ฆ„์ด ๋ถ™์—ฌ์ง„๋‹ค.
    ์ด๋ ‡๊ฒŒ ์ง€์ •ํ•ด์•ผ ์ข‹์€ ์ฝ”ํ‹€๋ฆฐ ์ปจ๋ฒค์…˜์— ์†ํ•œ๋‹ค. ๋‚˜์ค‘์— ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ๋„ ๋ณด๊ธฐ ํŽธ๋ฆฌํ•˜๊ณ , ๋˜ํ•œ ()๋‚ด์˜ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ƒ๊ด€์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š” ์ž๋ฐ”๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” ์ฝ”ํ‹€๋ฆฐ named parameter๋งŒ์˜ ์žฅ์ ์ด๋‹ค.
  • ์ฐธ๊ณ ๋กœ fun add(a: Int = 10, b:Int){} ์™€ ๊ฐ™์ด ๋””ํดํŠธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ๋””ํดํŠธ๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค๋ฉด named parameter๋ฅผ ๋ฐ˜๋“œ์‹œ ์ž‘์„ฑํ•˜์ž.
  • ํ•จ์ˆ˜ ์ด๋ฆ„์€ ํ•ญ์ƒ ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์นด๋ฉœ์ผ€์ด์Šค๋กœ ์ž‘์„ฑํ•˜๊ณ , ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด์•ผ ํ•œ๋‹ค. ํ•จ์ˆ˜๋ช… ๊ธธ์ด๋ฅผ ์‹ ๊ฒฝ์“ฐ๊ธฐ๋ณด๋‹จ ๊ธฐ๋Šฅ์ด ์ง๊ด€์ ์œผ๋กœ ์ž˜ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑํ•œ๋‹ค. ํ•จ์ˆ˜๋ช… ๊ธธ์ด๊ฐ€ ๊ธธ์–ด๋„ ์ƒ๊ด€ ์—†๋‹ค.
    ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ตœ๋Œ€ 4๊ฐœ๊นŒ์ง€ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค. ์ฝ”๋“œ ์ดํ•ด๊ฐ€ ํž˜๋“ค์–ด์ง„๋‹ค. (์ถœ์ฒ˜: ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”)
    ๋” ๋งŽ์€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ์ชผ๊ฐœ๋Š” ๊ฒŒ ์ข‹๋‹ค.
  • ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ๋ธ”๋กœ๊ทธ๋ณด๋‹จ ๊ณต์‹๋ฌธ์„œ๊ฐ€ ์ข‹๋‹ค.

 

 

 

 

 

 

 

 

๐Ÿ’ญ Retrospect

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

ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚˜๊ณ  ๋‚œ ๋’ค ๋ฉฐ์น ๊ฐ„์€ ์ข€ ํ•ด์ดํ•ด์กŒ๋˜ ๊ฒƒ ๊ฐ™์•„์„œ, ์˜ค๋Š˜ ์ €๋…๊ณผ ๋‚ด์ผ(ํ† ์š”์ผ)์€ ๋‚จ์€ ๋ชฉํ‘œ์™€ ๊ณผ์ œ ๊ตฌํ˜„์— ํž˜์„ ์Ÿ์„ ๊ณ„ํš์ด๋‹ค.

โ€‹

 

 

 

 

๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T