[Android TIL] 240315
๋ฐ˜์‘ํ˜•

 

 

 

~ Today I Learned ~

 

โœ”๏ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด (ํ•ธ๋“œํฐ ๋ฒˆํ˜ธ ๊ฐ€๋ฆฌ๊ธฐ)

gitignore์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ
(์ง„ํ–‰์ค‘) ์ฝ”ํ‹€๋ฆฐ ๋ฌธ๋ฒ• ๋˜๋Š” ๋ฐ๊นŒ์ง€ ๊ณต๋ถ€ ๋ฐ ๋ณต์Šต
(์ฃผ๋ง๊นŒ์ง€ ์ง„ํ–‰์ค‘) ํ‚ค์˜ค์Šคํฌ ๊ณผ์ œ Lv5 ๊นŒ์ง€ ๋„์ „

 

 

 

 


 

 

 

 

1. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด (ํ•ธ๋“œํฐ ๋ฒˆํ˜ธ ๊ฐ€๋ฆฌ๊ธฐ)

 

[Kotlin] ํ•ธ๋“œํฐ ๋ฒˆํ˜ธ ๊ฐ€๋ฆฌ๊ธฐ (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜)

๋ฌธ์ œ https://school.programmers.co.kr/learn/courses/30/lessons/12948 ์ ‘๊ทผ 1. phone_number๋ฅผ ํ•˜๋‚˜์”ฉ ์ž˜๋ผ์„œ ๋ฐฐ์—ด์— ๋„ฃ๋Š”๋‹ค. 2. return ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด 0๋ถ€ํ„ฐ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ-5๋งŒํผ *์„ ๋„ฃ๋Š”๋‹ค. 3. for๋ฌธ์„ ๋Œ๋ ค ๋ฐฐ์—ด์˜ ํฌ๊ธฐ -4

limheejin.tistory.com

  • ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜ ๋ฐ ๋ฌธ๋ฒ•์  ๊ฐœ๋…์„ ๋˜๋Œ์•„ ๋ณด๋Š” ์‹œ๊ฐ„์ด ๋˜์—ˆ๋‹ค.
  • split("")๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์˜์ , for๋ฌธ์„ ๋น„๋กฏํ•œ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ• ๊ฐœ๋…, ๋ฐฐ์—ด์˜ ์ดˆ๊ธฐํ™”์™€ joinToString()์˜ ๊ฐœ๋…๋„ ๋ณต์Šตํ–ˆ๋‹ค.

 

 

๐Ÿ’ก String์— ๋ฐ”๋กœ withIndex() ๋‚˜ lastIndex()๋ฅผ ์–ด๋–ป๊ฒŒ ์“ฐ๋Š” ๊ฑธ๊นŒ?

  • String์€ Array๋‚˜ List ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ๋ฐ ์™œ ๋ฐ”๋กœ ์ธ๋ฑ์Šค๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค.
  • ๋ฌธ์ž์—ด(String)์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฌธ์ž(Char)์˜ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„๋œ๋‹ค๊ณ  ํ•œ๋‹ค.
    ๋”ฐ๋ผ์„œ ๊ฐ ๋ฌธ์ž๋Š” ํ•ด๋‹น ๋ฌธ์ž์—ด์—์„œ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ
  • ์ด๋Š” ์ฝ”ํ‹€๋ฆฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Java, Python, C#, JS ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๊ตณ์ด ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€ ์ด์œ ๊ฐ€ ์—†์—ˆ๋‹ค.

 

 

๐Ÿ’ก padStart(length: Int, padChar: Char): String

  • ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ง€์ •๋œ ๊ธธ์ด๋งŒํผ์˜ ๋ฌธ์ž(padChar)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฃผ์–ด์ง„ ๊ธธ์ด์— ๋งž์ถ”๋Š” ์—ญํ• 
  • ๋นˆ ๋ฌธ์ž์—ด ""์€ ํŒจ๋”ฉ์ด ์ถ”๊ฐ€๋  ์œ„์น˜ (์–ด๋–ค ๋ฌธ์ž์—ด์ด ์˜ค๋”๋ผ๋„ ๊ฒฐ๊ณผ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ์— ""์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ )
  • "".padStart(phone_number.length - 4, '*') ๋Š” ์ „ํ™”๋ฒˆํ˜ธ ๊ธธ์ด์—์„œ ๋งˆ์ง€๋ง‰ 4์ž๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ๋งŒํผ *๋ฅผ ์ถ”๊ฐ€ํ•œ ๋ฌธ์ž์—ด ์ƒ์„ฑ

 

 

๐Ÿ’ก takeLast(n: Int): String

  • ๋ฌธ์ž์—ด์˜ ๋งˆ์ง€๋ง‰ n๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜
  • ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์—์„œ๋Š” phone_number.takeLast(4)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „ํ™”๋ฒˆํ˜ธ์˜ ๋งˆ์ง€๋ง‰ 4์ž๋ฆฌ๋ฅผ ์ถ”์ถœ

 

 

๐Ÿ’กphone_number.withIndex()

  • ๋ฌธ์ž์—ด phone_number์˜ ๊ฐ ๋ฌธ์ž์™€ ํ•ด๋‹น ๋ฌธ์ž์˜ ์ธ๋ฑ์Šค๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ณต์ž(iterator)๋ฅผ ๋ฐ˜ํ™˜
  • ์ด ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž(์—˜๋ฆฌ๋ฉ˜ํŠธ)์™€ ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ ๋™์‹œ์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • for ((i, c) in phone_number.withIndex()) { ... }
    - phone_number์˜ ๊ฐ ๋ฌธ์ž(c)์™€ ํ•ด๋‹น ๋ฌธ์ž์˜ ์ธ๋ฑ์Šค(i)๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ
    - ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „ํ™”๋ฒˆํ˜ธ์˜ ๊ฐ ๋ฌธ์ž์™€ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์ ‘๊ทผ

 

 

๐Ÿ’ก.lastIndex

  • ๋ฐฐ์—ด๋ช….lastIndex ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•จ

 

 

๐Ÿ’ก.slice()

  • slice(indices: IntRange): CharSequence
    - ๋ฌธ์ž์—ด์—์„œ ์ง€์ •๋œ ๋ฒ”์œ„์˜ ๋ฌธ์ž๋“ค์„ ์ถ”์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด CharSequence(์ผ๋ฐ˜์ ์œผ๋กœ String)๋กœ ๋ฐ˜ํ™˜
    - ์ธ๋ฑ์Šค ๋ฒ”์œ„๋Š” IntRange๋กœ ์ง€์ •
    - slice() ํ•จ์ˆ˜๋Š” ์›๋ณธ ์ปฌ๋ ‰์…˜์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ (์›๋ณธ ์ปฌ๋ ‰์…˜์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€)
  • phone_number.slice(last - 3..last): last - 3 .. last๋Š” ๋งˆ์ง€๋ง‰ 4์ž๋ฆฌ์˜ ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. 

 

 

๐Ÿ’ก.substring()

  • substring(startIndex: Int): ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์˜ ๋๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
    substring(startIndex: Int, endIndex: Int): ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์ข…๋ฃŒ ์ธ๋ฑ์Šค ์ „๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ (until ์ฒ˜๋Ÿผ)
  • phone_number.substring(length, length + 4)
    - length๋ถ€ํ„ฐ length + 4๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ถ”์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜

 

 

 

 

 

2. ํ‚ค์˜ค์Šคํฌ ๊ณผ์ œ Lv 5๊นŒ์ง€ ๊ตฌํ˜„ ๋…ธ๋ ฅ

  • ํ•™์Šต์ค‘. ์ €๋…์— ์ˆ˜์ • ์˜ˆ์ •

 

 

 

 

3. .gitignore

  • ์–ด์ œ git ์˜ค๋ฅ˜์ฒ˜๋ฆฌ์— ๊ด€ํ•ด ๋ฌธ์˜ํ–ˆ์„ ๋•Œ, ํŠœํ„ฐ๋‹˜์ด .gitignore์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์–ธ๊ธ‰ํ•˜์…จ๋‹ค.
  • .gitignore ํŒŒ์ผ: Git์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ
  • Git์€ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ถ”์ ํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๋„๊ตฌ์ธ๋ฐ, ๋•Œ๋กœ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ์ €์žฅ์†Œ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ .gitignore ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด Git์ด ํ•ด๋‹น ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋„๋ก ์ง€์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
# Built application files
*.apk
*.ap_

# Files for the ART/Dalvik VM
*.dex

# Java class files
*.class

# Generated files
bin/
gen/
out/

# Gradle files
.gradle/
build/

# Local configuration file (sdk path, etc)
local.properties

# Proguard folder generated by Android Studio
proguard/

# Log Files
*.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
captures/

# Intellij
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
.idea/caches
.idea/modules.xml
.idea/namespaces

# Keystore files
*.jks
  • ์œ„์˜ ๋‚ด์šฉ์€ Android ์•ฑ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ tipycalํ•œ .gitignore ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด๋‹ค.
  • ๋นŒ๋“œ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ (*.apk, *.ap_)
    ART/Dalvik VM์„ ์œ„ํ•œ ํŒŒ์ผ (*.dex)
    Java ํด๋ž˜์Šค ํŒŒ์ผ (*.class)
    ์ƒ์„ฑ๋œ ํŒŒ์ผ (bin/, gen/, out/)
    Gradle ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ (.gradle/, build/)
    ๋กœ์ปฌ ์„ค์ • ํŒŒ์ผ (local.properties)
    Android Studio์—์„œ ์ƒ์„ฑ๋œ Proguard ํด๋” (proguard/)
    ๋กœ๊ทธ ํŒŒ์ผ (*.log)
    Android Studio Navigation ํŽธ์ง‘๊ธฐ์˜ ์ž„์‹œ ํŒŒ์ผ (.navigation/)
    Android Studio ์บก์ณ ํด๋” (captures/)
    IntelliJ IDEA ํŒŒ์ผ (*.iml, .idea/)
    ํ‚ค์Šคํ† ์–ด ํŒŒ์ผ (*.jks)
  • ์ด๋Ÿฌํ•œ ํŒŒ์ผ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ ์ €์žฅ์†Œ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋นŒ๋“œ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ์€ ํฌ๊ธฐ๊ฐ€ ํฌ๊ณ  ๋ณ€๊ฒฝ ๋นˆ๋„๊ฐ€ ๋‚ฎ์•„์„œ Git ์ €์žฅ์†Œ์— ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ํŒŒ์ผ๋“ค์„ .gitignore ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜์—ฌ Git์ด ๋ฌด์‹œํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 


 

~ Trouble Shooting ~

 

 

 

1. ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์˜ '๊ฒ€์ƒ‰' ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

  • ๋ณด๋‹ˆ๊นŒ 3์›” 7์ผ TIL์—์„œ ๊ณ ์นœ๋‹ค๊ณ  ์ ์–ด๋†จ๋˜๋ฐ ๋ชป ๊ณ ์ณ์„œ ์˜ค๋Š˜ ๊ณ ์น˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

 


~ Retrospect ~

 

์˜ค๋Š˜์€ ์ฝ”ํ‹€๋ฆฐ ๋ฌธ๋ฒ• ์„ธ์…˜ ๋งˆ์ง€๋ง‰๋‚ ์ด๋‹ค. ๋‹ค์Œ์ฃผ๋ถ€ํ„ฐ๋Š” ์ด๋ก ์—์„œ ๋ฒ—์–ด๋‚˜ ์‹ค์ „์ ์ธ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ ์˜์—ญ์œผ๋กœ ๋“ค์–ด๊ฐˆํ…๋ฐ, ์ด๋ฒˆ์— ๋ฐฐ์šฐ๊ณ  ์ •๋ฆฌํ•œ ๋ฌธ๋ฒ•์„ ๋†“์น˜์ง€ ๋ง๊ณ , ์ƒˆ๋กœ ๋ฐฐ์šฐ๊ฑฐ๋‚˜ ๊ถ๊ธˆํ•œ ๊ฑฐ ์žˆ์œผ๋ฉด ๊ณ„์† ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ์‹์œผ๋กœ ์—ด์‹ฌํžˆ ๋ถ™๋“ค์–ด ๋†“์ž.

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

 

 

 

๊ทธ๋ฆฌ๊ณ  ์ด ์˜์ƒ ๋Œ€๋ฐ•์ด๋‹ค... ์ฒ˜์Œ์—” ๋ช‡ ๋ถ„๊ฐ„์€ ๋ฌดํ‘œ์ •์œผ๋กœ ๋ณด๋‹ค๊ฐ€ ํ›„๋ฐ˜๋ถ€ ๊ฐˆ์ˆ˜๋ก ๋ชฐ์ž…ํ–ˆ๋‹ค. ์š”์ฆ˜ ํžˆ์–ด๋กœ๋ฌผ์—์„œ ์ฃผ๊ตฌ์žฅ์ฐฝ ๋‚˜์˜ค๋Š” ์–‘์ž์„ธ๊ณ„๊ธด ํ•˜์ง€๋งŒ, Alan Becker๊ฐ€ ๋ฌผ๋ฆฌํ•™/์—ฐ์ถœ/์‚ฌ์šด๋“œ ๋ถ€๋ถ„์—์„œ ๊ณ ์‹ฌํ•œ ๊ฒŒ ๋Š๊ปด์ง„๋‹ค.

 

 

 

 

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