๐ฑ Today I Learned (์ง์ค์๊ฐ : 9์๊ฐ 5๋ถ)
- (09:25 ~ 11:00 / 1์๊ฐ 30๋ถ) ๋ฐ์ผ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ํ์ด ๋ฐ ํ ์คํฌ๋ผ
- (11:00 ~ 12:10 / 1์๊ฐ 10๋ถ) ๋ฒ ์ด์ง๋ฐ ๊ฐ์ 3์ฃผ์ฐจ, 4์ฃผ์ฐจ ์๊ฐ
- (12:10 ~ 13:00 / 50๋ถ) ์คํ ๋ค๋๋ฐ ๊ฐ์ 3์ฃผ์ฐจ ์๊ฐ
- (14:20 ~ 15:00 / 40๋ถ) ์คํ ๋ค๋๋ฐ ๊ฐ์ 4์ฃผ์ฐจ ์๊ฐ
- (15:00 ~ 17:05 / 2์๊ฐ 5๋ถ) Joyce ์๋๋ก์ด๋ ์์ ์ฝ๊ธฐ
- (17:05 ~ 18:45 / 1์๊ฐ 40๋ถ) ์คํ ๋ค๋๋ฐ 4์ฃผ์ฐจ ๊ณผ์ ๊ตฌํ : ui ๊ตฌํ ์๋ฃ
- (19:50 ~ 20:30 / 40๋ถ) ์คํ ๋ค๋๋ฐ 4์ฃผ์ฐจ ๊ณผ์ ๊ตฌํ : ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ ๊ตฌํ ์๋
- (20:30 ~ 21:00 / 30๋ถ) ๋ฐ์ผ๋ฆฌ ํ ํ๊ณ
*** ์ ์ฌ 13:00 ~ 14:00 / ์ ๋ 18:00 ~ 19:00 ์ ์ธ
โ
๐ ์ด๋ฒ ์ฃผ ๋ชฉํ
[V] ์๋ จ ๊ฐ์ ๋ค ๋ฃ๊ธฐ[ ] ์คํ ๋ค๋ 2์ฃผ์ฐจ ์ฌํ ๊ตฌํ : ์๋ จ ๊ฐ์ ์ฒดํ(fragment, fragment ๊ฐ์ ๋ฐ์ดํฐ์ ๋ฌ) ํฌ๊ธฐ[V] ์คํ ๋ค๋๋ฐ ๋ฐ๋ฆฐ ๊ฐ์ ๋ฃ๊ธฐ[V] ์ ๋ฌธ ๊ฐ์ธ ๊ณผ์ ํด์ค ํ์ต[V] ๋ฒ ์ด์ง๋ฐ ๊ฐ์ 4์ฃผ์ฐจ๊น์ง- [ ] ์คํ ๋ค๋ 4์ฃผ์ฐจ ๊ณผ์ ๊ตฌํ
- [ ] ์๋ จ ๊ฐ์ธ ๊ณผ์ ํ์ ๊ตฌํ : ์๋ จ ๊ฐ์ ์ฒดํ(notification, dialog, recyclerview, fragment ์ข ํฉ)
- [ ] ์ ์ฐฝ๊ฒฝ ๋ด์ฉ ์ ๋ฆฌ
- [ ] ๋ฐ๋ฆฌ์ ์์ฌ ์๋๋ก์ด๋ ์์ ์ง๋ ๋ถ๋ถ๊น์ง ๋ค ํ๊ธฐ
- [ ] ์๊ณ ๋ฆฌ์ฆ ์ง์ค ์ฝ๋์นดํ
- [ ] ๋งํฌ ์๊ฐ
- [ ] (์ฌํ) KIA ๊ฐ๋ ํ๊ธฐ
- [ ] (์ฌํ) Android Developer ์ฝ๊ธฐ
- [ ] (์ฌํ) ๊ฐ์ธํ๋ก์ ํธ UI ๊ตฌํ
- [ ] (์ฌํ) ์ ๋ฒ ํ๋ก์ ํธ ์ฝ๋ ๋ฏ์ด๋ณด๊ธฐ
โ
1. ์๊ณ ๋ฆฌ์ฆ ํ์ด (์ด์ํ ๋ฌธ์ ๋ง๋ค๊ธฐ)
- string์ split์ ์ค์ํ๋ฉด ๋ฐฐ์ด์ ์ ์ฅ, toLowerCase()์ toUpperCase()์ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํ, mapIndexed()๋ ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ ๋ฑ ๊ธฐ์กด๊ฐ์ ๋ณ๊ฒฝํ๋์ง/์๋ก์ด ๊ฒ์ ๋ฐํํ๋์ง์ ๋ํด ์ฃผ์ํด์ผ ํ ๊ฐ๋ ์ด ๋ง์๋ค.
- for(i in string)์ ํ๋ฉด string์ ์๋ char๊ฐ ํ๋์ฉ ๊บผ๋ด์ง๋ค๋ ๊ฒ๋ ์ฒ์ ์์๋ค.
๐กsplit
- ๊ดํธ์์ ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ๋ถ๋ฆฌํ์ฌ ๋ฐฐ์ด๋ก ๋ฐํํ๋ ํจ์
- ์ฃผ์ด์ง ๋ฌธ์์ด์ ํน์ ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ ๊ฐ๊ฐ์ ๋ถ๋ถ์ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฒ์ด๋ผ๊ณ ํ ์ ์์
val str = "apple banana orange"
val parts = str.split(" ")
println(parts) // [apple, banana, orange]
- ์ ์์์์๋ str ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋๋์ด parts ๋ฐฐ์ด์ ์ ์ฅํจ
- ๊ฒฐ๊ณผ์ ์ผ๋ก parts ๋ฐฐ์ด์๋ "apple", "banana", "orange" ์ธ ๊ฐ์ ๋ฌธ์์ด์ด ๋ค์ด์์
val str = "apple,banana,orange,grape"
val fruits = str.split(",", limit = 2)
println(fruits) // [apple, banana, orange, grape]
- split ํจ์์ ๋ ๋ฒ์งธ ์ธ์๋ก๋ ์ ํ๋ ๊ฐ์์ ๋ถ๋ฆฌ๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋๋ ๋ฌธ์์ด์ ์ต๋ ๊ฐ์๋ฅผ ์ง์
- ์ ์์์์๋ limit ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋ ๋ ๊ฐ์ ๋ถ๋ถ์ผ๋ก ๋ฌธ์์ด์ ๋ถ๋ฆฌ
- ๊ฒฐ๊ณผ์ ์ผ๋ก fruits ๋ฐฐ์ด์๋ "apple", "banana,orange,grape" ๋ ๊ฐ์ ๋ฌธ์์ด์ด ๋ค์ด์์
๐กtoLowerCase(), toUpperCase()
val str = "Hello, World!"
val lowerCaseStr = str.toLowerCase()
println(lowerCaseStr) // ์ถ๋ ฅ: hello, world!
val upperCaseStr = str.toUpperCase()
println(upperCaseStr) // ์ถ๋ ฅ: HELLO, WORLD!
- ๋ฌธ์์ด์ ๋์๋ฌธ์๋ฅผ ๋ณํ
- ์ด ๋ฉ์๋๋ค์ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํ๊ธฐ ๋๋ฌธ์, ์๋ณธ ๋ฌธ์์ด์ ๊ทธ๋๋ก ์ ์ง๋จ
๐กmapIndexed()
fun <T, R> Iterable<T>.mapIndexed(transform: (index: Int, T) -> R): List<R>
val list = listOf("apple", "banana", "orange")
// ๊ฐ ์์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ๊ธธ์ด์ ํจ๊ป ๋ฌธ์์ด์ ๋ณํ
val result = list.mapIndexed { index, element ->
"$index: ${element.toUpperCase()}(${element.length})"
}
println(result) // ์ถ๋ ฅ: [0: APPLE(5), 1: BANANA(6), 2: ORANGE(6)]
- ์ปฌ๋ ์ ์ ๊ฐ ์์์ ๋ํด ์ธ๋ฑ์ค์ ํจ๊ป ์์ ํ ์ ์๋๋ก ํด์ฃผ๋ ํจ์
- ๊ฐ ์์์ ๋ํด ์ธ๋ฑ์ค๋ฅผ ํฌํจํ์ฌ ์ง์ ๋ ๋ณํ ํจ์๋ฅผ ์ ์ฉํ ์ ์์
- ๋งค๊ฐ๋ณ์(transfrom): ์์์ ์ธ๋ฑ์ค์ ๋ํด ์ ์ฉํ ๋ณํ ํจ์. ์ธ๋ฑ์ค์ ์์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ณ ๋ณํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
- ๋ฐํ๊ฐ: ๋ณํ๋ ์์๋ก ์ด๋ฃจ์ด์ง ์๋ก์ด ๋ฆฌ์คํธ์ ์ ์ฅ๋์ด ๋ฐํ
2. ๋ฒ ์ด์ง๋ฐ 3/4์ฃผ์ฐจ ๊ฐ์
๐ก ๋ฒ ์ด์ง๋ฐ 3์ฃผ์ฐจ
- ์ ์ญ๋ณ์๋ ํ์์ ์ธ ์ํฉ ์ด์ธ์ ์ฌ์ฉํ์ง ๋ง์. ํจ์์ ํ์ผ์ด ๋ง์์ง์๋ก ์ ์ญ๋ณ์์ ๊ฐ์ด expectation๊ณผ ๋ค๋ฅด๊ฒ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ๋ค ์ฐพ์๋ด์ ๋ค์ ๋ฐ๊ฟ์ฃผ๋ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค.
ํนํ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ ์ง์ญ๋ณ์๋ก ์ ์ธํ๋ ๊ฒ์ ์ถ์ฒํ๋ฉฐ, ์ ์ญ์ผ๋ก ์ฌ์ฉ์ ์กฐ์ฌ์ค๋ฝ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค. - ๊ธฐ๋ณธ์ ์ผ๋ก๋ ํญ์ val๋ก ์ ์ธํ๋ ์ต๊ด์ ๋ค์ด๊ณ , ๋ด๊ฐ ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ ๋ var๋ก ์์ ํ๋ ๊ฒ์ ์ถ์ฒ
- Nullability๋ฅผ ์ค์ ํ ๋, ์ฝํ๋ฆฐ ๊ฐ๋ฐ์๋ค์ ์ปจ๋ฒค์
์ผ๋ก๋ let์ ์ฌ์ฉํ์ฌ Null์ฒ๋ฆฌ๋ฅผ ํ๋ค.
๋ค๋ฅธ ์ค์ฝํํจ์๋ฅผ ์ฌ์ฉํด๋ ๋์ง๋ง, ๋์ฒด์ ์ผ๋ก๋ let์ ์ฌ์ฉํ๋ ํธ์ด๋ค.
fun main(){ something?.let{ println(it) // something }โ
- ์๋น์ค ์ฐ์ฐ์ ?: ๋ค์๋ a = b์ ๊ฐ์ ์ ์ธ์์ด ์ง์ ์ ์ผ๋ก ์ฌ ์ ์๋ค. ๊ทธ๋ฌ๋ run๋ธ๋ก์ ์ด์ฉํ์ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
var something: String? = null something?.let { println(it) } ?: run { nullCount = nullCount + 1 } }โ
- ์๊น ๋งํ๋ฏ, Nullability๋ฅผ ์ฌ์ฉํ ๋ ๋ณดํต์ ?.let{ } ?: ์ ์ปจ๋ฒค์
์ผ๋ก ์ฌ์ฉํ์ง๋ง if-else ์ฌ์ฉ์ด ์ณ์ ๋๊ฐ ์๋ค.
๋ฐ๋ก let ์ค์ฝํ ๋ด์ ๊ฐ์ด Null์ผ ๋๋ค. ์ง์ ํ ๊ฐ์ด null์ด ์๋์ด๋, ์ค์ฝํ ์์ด Null์ด ๋๋ฉด ์๋น์ค์ฐ์ฐ์ ๋ค๋ฅผ ์ถ๋ ฅํด๋ฒ๋ฆฌ๋ ์ํ์ฑ์ด ์๋ค.
๐ก ๋ฒ ์ด์ง๋ฐ 4์ฃผ์ฐจ
- ๋ ๊ฐ์ ์กํฐ๋นํฐ๋ฅผ ์ฐ๊ฒฐ ํ ๋๊ฒจ์ฃผ๊ณ ๋ค์ ๋์์ค๋ ๊ณผ์
(1-1) MainActivity์์ onPause
(1-2) SecondActivity์์ onCreate - onStart - onResume
(1-3) MainActivity์์ onStop
(2-1) SecondActivity์์ onPause
(2-2) MainActivity์์ onRestart - onStart - onResume
(2-3) SecondActivity์์ onStop - ํ๋ฉด์ ํ์ ํ๊ฒ ๋๋ฉด onSaveInstanceState - onDestroy - ๋ค์ onCreate - onStart - onRestoreInstanceState - onResume ์ด ํธ์ถ๋๋ฉด์ ์ฑ์ ์์ ์ฃผ๊ธฐ๊ฐ ๋ค์ ์คํ๋์ด๋ฒ๋ฆผ
- ํ๋ฉด์ ํ์ ํ ๋ ๊ฐ์ ์ด๋๊ฐ์ ์ ์ฅํด์ฃผ์ด์ผ ํจ (Bundle์ ๊ธฐ๋ก)
(1) ์๋ฅผ ๋ค์ด ์ ์ญ๋ณ์๋ก count๋ผ๋ ๊ฑธ ์ ์ธํด์ค๋ค์,
(2) onSaveInstanceState์์ count ๊ฐ์ ์ ์ฅํด๋๊ณ : outState.putInt("count", count)
(3) onRestoreInstanceState์์ savedInstanceState.getInt("count") ๋ฑ์ผ๋ก ํค๊ฐ์ ์ ๋ ฅํ๊ณ ๋ถ๋ฌ์ค๋ฉด ๋จ
3. ์คํ ๋ค๋๋ฐ 3/4์ฃผ์ฐจ ๊ฐ์
๐ก ์คํ ๋ค๋๋ฐ 3์ฃผ์ฐจ
- ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ๋ฌธ์๋ฅผ ์ํํํ๋ผ.
- Fragment๋ ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์์ผ๋ฉฐ, Activity๋ ๋ค๋ฅธ ํ๋๊ทธ๋จผํธ์ ํธ์คํ
๋์ด์ผ ํ๋ค.
Activity๊ฐ onPause() ์ํ์ผ ๋ ํด๋น ์กํฐ๋นํฐ์ ์ํด์๋ fragment๋ ์ผ์ ์ ์ง๋๋ฉฐ,
์กํฐ๋นํฐ๊ฐ ์๋ฉธ๋๋ฉด ํด๋น ํ๋๊ทธ๋จผํธ๋ ์๋ฉธ๋๋ค. - ์ด์ ๊น์ง ์ฐ๋ฆฌ๋ ์ธํ
ํธ๋ฅผ ํ ๋๋ putExtra("ํค", ๊ฐ) ํ๋ํ๋ ์์ฑํ๋ฉฐ ํค์ ๊ฐ์ ํ๋ํ๋ ์ ๋ฌํ์ง๋ง,
๋ฒ๋ค์ ์ฌ์ฉํ์ฌ ์ค๋ธ์ ํธ ๋จ์๋ก ๋ฌถ์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์์ (์: putExtras(bundleOf(*pair))
๋ฒ๋ค์ Parcelable๋ก ๊ตฌํ๋์ด ์์ (Serializable ์ง๋ ฌํ๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์๋๋ฅผ ๋ณด์) - (๋ผ์ด๋ธ์ฝ๋ฉ)
- ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ๋ฅผ ๊ตฌํํ ๋ data๋ฅผ ๋ฃ๋ ๋ถ๋ถ์ ํด๋ฆฐ์ํคํ ์ฒ๋ฅผ ์ํด data ํด๋๋ฅผ ๋ง๋ค์ด ๋ฃ์ด์ค
- data๋ฅผ ๋ง๋ค๋ data class๋ก ์์ฑํ์ฌ val๋ก data์ ๋ถ๋ฅ๋ฅผ ์์ฑํด์ค๋ค
datalist๋ฅผ ์ฝํ๋ฆฐ ํ์ผ๋ก ๋ง๋ค์ด ๋ฆฌ์คํธ๋ฅผ ์ ์ธํด์ฃผ๊ณ , return listOf ์์ ๋ชฉ๋ก์ ๋ฃ์ด์ค
- ์ด ๋ฆฌ์คํธ๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ ๋ฌํ๊ณ , ์ธ์คํด์ค๋ฅผ ํ๋ฒ๋ง ์์ฑํ๊ธฐ ์ํด DataSource ํด๋์ค ์์ฑ ๋ฐ companion object ์ ๋ ฅ (์์ง ํํฐ๋์ด ์์ฑํ์ ์ฑ๊ธํค์ ๊ตฌํ DataSource.kt ๋ถ๋ถ์ด ์ ์ดํด๊ฐ ์ ๊ฐ๋ค. ๋์ค์ ๋ค์ ๋ณด์.) - inline์ ์ฌ์ฉํ์ จ๋๋ฐ ๊ด๋ จ ๋ด์ฉ์ ์ดํดํ๊ณ ์ถ๊ณ , ํ์ฅํจ์์ ๋ํด ์ดํดํ๊ณ ์ถ๋ค!
๐ก ์คํ ๋ค๋๋ฐ 4์ฃผ์ฐจ
- 3์ฃผ์ฐจ์ ์งํํ๋ ๋ผ์ด๋ธ์ฝ๋ฉ์ ๋ค์ ์งํํ๋ ๋ด์ฉ์ด์๋ค.
- ์์ง๋ ๋ช๋ช ํ์ฅํจ์์ ๋ํด ์ดํด๊ฐ ์ ๊ฐ์ง์๋๋ฐ, ์ด ๋ถ๋ถ์ ๊ธฐ๋ณธ ํ ๋๋ถํฐ ์๊ณ ๊ฐ์ธ์ ์ผ๋ก ์ฐพ์๋ณด๊ณ ์ถ๋ค.
4. ์คํ ๋ค๋๋ฐ 4์ฃผ์ฐจ ๊ณผ์ ์์
- UI๊น์ง๋ ๊ตฌํ์ ์๋ฃํ๋๋ฐ, ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ๋ฅผ ์ํ ์ด๋ํฐ ๋ถ๋ถ์์ ๋ง์ด ๋งํ๋ค.
- ๋ด์ผ ์๋ฒฝํ๊ฒ ๋ฐ์ดํฐ์ฐ๊ฒฐ์ ํด์ฃผ๊ณ , ๋ชจ๋๋ก ๊ฐ์ ํ๋ฒ์ ๋๊ธฐ๋ ๊ฒ๊น์ง ํด ๋ณผ ์์ ์ด๋ค.
5. Joyce ์๋๋ก์ด๋ ์์ ๊ณต๋ถ
์ด๋ฏธ ์๋ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ , ๋ชจ๋ฅด๋ ๋ถ๋ถ์ ๊ณต๋ถํ ๊ฒธ ์์ ๊ณต๋ถ๋ฅผ ๋ณํํ๊ณ ์๋ค.
์๋๋ ๊ธฐ์กด์ ์๋ ๋ด์ฉ ์ด์ธ์ ํท๊ฐ๋ฆฌ๊ฑฐ๋ ๋ชฐ๋๋ ๋ถ๋ถ์ด๋ค.
์ค๋์ 1ํ์ด์ง๋ถํฐ 151ํ์ด์ง๊น์ง ๊ณต๋ถํ๋ค.
1. ์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ ์ ๋ฌธ
- ์กํฐ๋นํฐ์์ ์์์ผ๋ก ๋ถ์ด์๋ : AppCompatActivity()๊ฐ ๋ฌด์์ธ์ง ๊ถ๊ธํ๋๋ฐ, AppCompatActivityํด๋์ค๋ Activity ํด๋์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๋ค. AppCompatActivity ํด๋์ค๋ ์ค๋๋ ์๋๋ก์ด๋ ๋ฒ์ ๊ณผ ํธํ์ฑ์ ์ ์งํ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ํด๋์ค๋ก, ์๋๋ก์ด๋ ์คํ๋์ค 1.5๋ฒ์ ์ดํ๋ถํฐ ์๋ก ์์ฑํ๋ ๋ชจ๋ ์กํฐ๋นํฐ ํด๋์ค๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์๋ฐ๋ ๊ฒ์ด๋ผ ํ๋ค.
- onCreate() ๊ดํธ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ ์๋ ๋งค๊ฐ๋ณ์ savedInstanceState: Bundle?์ ๋ํด์๋ ๊ถ๊ธํ๋ค. null ๊ฐ์ด ๊ฐ๋ฅํ Bundle์ ํน์ ํ ์ํฉ์์ ์กํฐ๋นํฐ๊ฐ ์ ์ฅํ ๊ฐ์ ๋ค์ ๋ถ๋ฌ์ค๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ null์ด ๊ฐ๋ฅํ ํ์์ด๋ฏ๋ก ๊ทธ๋์์ ํ๋ก์ ํธ์์๋ ๋ฑํ ์ ์ฅ๋ ๊ฐ์ ๋ถ๋ฌ์ค์ง ์์ ๊ฒ์ด๋ค.
- super.onCreate(savedInstanceState)๋ ์์ ํด๋์ค(super)์ onCreate()๋ฅผ ๋จผ์ ์คํํ๋ผ๋ ์๋ฏธ๋ค.
์ด ์ค์ด ์์ผ๋ฉด, ๋ด๊ฐ ์ ์ ์ฝ๋๋ง ์คํ๋์ด SuperNotCalledException๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ์๊ธด๋ค. - ๋งค๋ํ์คํธ ํ์ผ์์ activity ์์ android:exported ๊ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฑ๊ณผ ์ํธ์์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ค์ ํ ์ ์๋ค.
2. ์ฝํ๋ฆฐ ๋ฌธ๋ฒ ๋น ๋ฅด๊ฒ ์ดํด๋ณด๊ธฐ
- ์ฝํ๋ฆฐ์ ์ฝ๊ฒ ์คํํ๊ธฐ ์ํด File - New - Scratch File - Kotlin ์ ์ ํํ๊ณ ,
ํ๋ก์ ํธ ์ฐฝ์์ Scratches and Consoles๋ฅผ ์ ํํ๋ฉด .kts ์คํฌ๋์น ํ์ผ๋ก ๊ฐ๋จํ ์๋ ์ํฌ ์ ์๋ค.
(kt๊ฐ ์๋๋ผ kts์ธ ์ด์ ๋ ์คํฌ๋ฆฝํธ ํ์ผ์ด๊ธฐ ๋๋ฌธ์ด๋ค.) - ์ฝํ๋ฆฐ์ ์๋ฃํ์ ๋ชจ๋ ์ฐธ์กฐํ์ด๋ค. ์ฆ ๋ชจ๋ ์๋ฃํ์ด ๊ฐ์ฒด ํํ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- val numRange : IntRange = 1..5; val charRange : CharRange = 'a' .. 'e' ์ ๊ฐ์ด ๋ฒ์ํด๋์ค ์์ฑ๋ ๊ฐ๋ฅํ๋ค.
- ์ (Set)์ ์์๊ฐ ์๋ค. ๋ํ ์ค๋ณต๋์ง ์์ ์์๋ค๋ก ๋ง๋ค์ด์ง๋ฏ๋ก, ๊ฐ์ ๊ฐ์ ์๋ฐฑ๋ฒ ์ถ๊ฐํ๋๋ผ๋ ํด๋น ๊ฐ์ ํ๋๋ง ์ถ๊ฐ๊ฐ ๋๋ค. ์ฝ๊ธฐ์ ์ฉ ์ ์์ฑ์ setOf(1,1,2,2,3), ์ฝ๊ธฐ ์ฐ๊ธฐ ๋ชจ๋ ๊ฐ๋ฅํ ์ ์ mutableSetOf()๋ก ์์ฑํ๋ค.
- ๋งต(Map)์ ํค๋ ์ค๋ณต๋์ง ์๋๋ก ํด์ผํ๋ค. ๋งต์ ์์๋ Pair(A,B)๋ก ์ฌ์ฉํ๋๋ฐ, ์ด๋ฅผ A to B๋ก๋ ํํ ๊ฐ๋ฅํ๋ค.
(์) val immutableMap = mapOf("name" to "junsu", "age" to 13, "height" to 160) - ํจ์๋ฅผ ์์ฑํ ๋ ์ฃผ ์์ฑ์: class Person(name : String) {} ๋ถ๋ถ์ด ์๋ ํด๋์ค ๋ฐ๋ ๋ด๋ถ์์ constructor ํค์๋๋ฅผ ์ด์ฉํ์ฌ ๋ง๋๋ ๋ณด์กฐ(๋ถ) ์์ฑ์์ ๊ฒฝ์ฐ, ์ฃผ ์์ฑ์๊ฐ ์กด์ฌํ ๋๋ ๋ฐ๋์ this ํค์๋๋ฅผ ํตํด ์ฃผ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๋ค.
(์) class Person(name: String) { constructor(name : String, age : Int) : this(name) {} } - comanion ๊ฐ์ฒด: ์ ์๋ ๋ณ์๋ ๋ฉ์๋๋ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์๊ณ ์ ๊ทผํ๊ธฐ ์ํด companion ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
class Dinner{ companion object{ val MENU = "pasta" // ์ ์ ๋ณ์ ์์ฑ fun eatDinner(){ // ์ ์ ๋ฉ์๋ ์์ฑ println("$MENU is yummy!") } } } println(Dinner.Companion.MENU) // pasta println(Dinner.MENU) // Companion ์๋ต ๊ฐ๋ฅ -> pasta Dinner.eatDinner() // pasta is yummy!โ
- ์ถ์ ํด๋์ค: ๊ทธ ์์ฒด๋ก๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ํด๋์ค๋ก, ์ผ๋ฐ์ ์ผ๋ก ์ถ์๋ฉ์๋๊ฐ ํฌํจ๋ ํด๋์ค
์์๋ฐ๋ ์์ ํด๋์ค์ ํน์ ๋ฉ์๋ ๊ตฌํ์ ๊ฐ์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉ. ์ถ์ ํด๋์ค ์์ฒด๋ก๋ ์ง์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๊ณ ์์ ํด๋์ค์์ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๋ค์, ์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋จ
- (์) ๊ฒ์์ ์ค์ฒด(๊ฐ์ฒด)๊ฐ ์์ง๋ง, ์ค๋ฒ์์น๋ ์ค์ฒด(๊ฐ์ฒด)๊ฐ ์์
์ฌ๊ธฐ์ ๊ฒ์์ ์ถ์ํด๋์ค, ์ค๋ฒ์์น๋ ์ถ์ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค์
abstract class Game { fun startGame() { println("๊ฒ์์ ์์ํ์ต๋๋ค.") } // ์ถ์ ๋ฉ์๋ abstract fun printName() } class Overwatch : Game() { override fun printName() { // ์ถ์ ๋ฉ์๋ ๊ตฌํ println("์ค๋ฒ์์น์ ๋๋ค.") } } val overwatch = Overwatch() overwatch.startGame() // ๊ฒ์์ ์์ํ์ต๋๋ค. overwatch.printName() // ์ค๋ฒ์์น์ ๋๋ค.โ
- ๋ฐ์ดํฐ ํด๋์ค: ํน์ ํ ๋ฉ์๋์ ์คํ๋ณด๋ค๋ ๋ฐ์ดํฐ ์ ๋ฌ์ ๋ชฉ์ ์ด ์๋ ํด๋์ค. ์ฝํ๋ฆฐ์ ๋ฐ์ดํฐ ์ ๋ฌ์ฉ ๊ฐ์ฒด๋ฅผ ๊ฐํธํ๊ฒ ์์ฑํ๋๋ก data class๋ผ๋ ํค์๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฃผ ์์ฑ์์๋ ๋ฐ๋์ val ํน์ var ๋งค๊ฐ๋ณ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ ํด๋์ค๋ ๊ฐ๊ฐ์ ํ๋กํผํฐ์ ๋ํด toString(), copy()์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ๋ง๋ฆ
- toString() : ๊ฐ์ฒด์ ํฌํจ๋์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ์ฌ ๋ณผ ์ ์์. ์์ฑ์์ ํฌํจ๋ ํ๋กํผํฐ๋ง ์ถ๋ ฅ
- copy() : ๊ฐ์ฒด์ ์์๋ค์ ๋ณต์ฌํ์ฌ ๋ฐํํ๋ ๋ฉ์๋. ์ธ์๋ก ๋ฐ์ ํ๋กํผํฐ๋ง ํด๋น ๊ฐ์ผ๋ก ๋ฐ๋์ด ๋ณต์ฌ
data class Memo(val title : String, val content : String, var isDone : Boolean) var memo1 = Memo(title = "๋งํธ ๊ฐ๊ธฐ", content = "๊ณ๋, ์ฐ์ , ๋นต", isDone = false) var memo2 = memo1.copy(content = "์นซ์, ๊ณผ์") // memo1์ ๋ณต์ฌํ์ฌ content ํ๋กํผํฐ๋ง ๋ณ๊ฒฝ println(memo1.toString()) // Memo(title=๋งํธ ๊ฐ๊ธฐ, content=๊ณ๋, ์ฐ์ , ๋นต, isDone=false) println(memo2.toString()) // Memo(title=๋งํธ ๊ฐ๊ธฐ, content=์นซ์, ๊ณผ์, isDone=false)โ
- ์ธํฐํ์ด์ค : ํด๋์ค๋ค์ด ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๊ฒ๋ ๊ฐ์ ํ๋ ์ญํ
๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์์ํ ์์๋ค์, ์ธํฐํ์ด์ค ๋ด์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋๋ค์ ๋ฐ๋์ ๊ตฌํํด์ฃผ์ด์ผ๋ง ์๋ํจ
interface Car{ abstract fun drive() fun stop() // ์ถ์ํด๋์ค์ ๋ฌ๋ฆฌ, ์ธํฐํ์ด์ค์์๋ abstractํค์๋๋ฅผ ์๋ต ๊ฐ๋ฅ fun destroy() = println("์ฐจ๊ฐ ํ๊ดด๋์์ต๋๋ค.") // ํน๋ณํ ํค์๋ ์์ด ๋ํดํธ ๋ฉ์๋ ๊ตฌํ } class Ferrari : Car { //์ธํฐํ์ด์ค์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋๋ค์ ๋ฐ๋์ ๊ตฌํํด์ฃผ์ด์ผ ์ค๋ฅ๊ฐ ๋์ง ์์ override fun drive() { println("ํ๋ผ๋ฆฌ๊ฐ ๋ฌ๋ฆฝ๋๋ค.") } override fun stop() { println("ํ๋ผ๋ฆฌ๊ฐ ๋ฉ์ถฅ๋๋ค.") } } val myFerrari = Ferrari() // ๊ฐ์ฒด ์์ฑ myFerrari.drive() // ํ๋ผ๋ฆฌ๊ฐ ๋ฌ๋ฆฝ๋๋ค. myFerrari.stop() // ํ๋ผ๋ฆฌ๊ฐ ๋ฉ์ถฅ๋๋ค. myFerrari.destroy() // ์ฐจ๊ฐ ํ๊ดด๋์์ต๋๋ค.โ
- ํ ํด๋์ค์์ ํด๋์ค๋ ๋จ ํ ๊ฐ๋ง ์์๋ฐ์ ์ ์์ผ๋, ์ธํฐํ์ด์ค๋ 2๊ฐ ์ด์ ๊ตฌํํ์ฌ ์์์ํฌ ์ ์๋ค.
(์) interface Animal {} ; interface Human {} ; class Korean : Animal, Human {} - ๋๋ค์(Lambda Expression)์ ๋ํด์ ๊ฐ๋จํ ์ ๋ฆฌํ์๋ค.
- SAM(Single Abstract Method) ๋ณํ
- button.setOnclickListener() {} ๋ก ๊ฐ๋จํ ๊ตฌํํ ์ ์๋ ๊ฒ์ ๋ชจ๋ SAM ๋ณํ ๋๋ถ์
- ๋๋ค์์ด ์๋์๋ ๋๋ค์์ฒ๋ผ ์ทจ๊ธํ ์ ์๊ฒ ํด์ค
- ์กฐ๊ฑด: 1. ์ฝํ๋ฆฐ ์ธํฐํ์ด์ค๊ฐ ์๋ ์๋ฐ ์ธํฐํ์ด์ค์ฌ์ผ ํ ๊ฒ
2. ์ธํฐํ์ด์ค ๋ด์๋ ๋ฑ ํ ๊ฐ์ ์ถ์ ๋ฉ์๋๋ง ์กด์ฌํ ๊ฒ
3. ๋ ์ด์์ ์๋ํฐ์ ๋ ์ด์์ ํ์ผ
- ์ด๋ฏธ ๋ค ์๋ ๋ด์ฉ๋ฐ์ ์์ด์ ์ ๋ฆฌํ ๊ฒ ์์๋ค.
4. ํ๋ฉด ์ ์ดํ๊ธฐ (์กํฐ๋นํฐ, ํ๋๊ทธ๋จผํธ)
- ์๋๋ก์ด๋ 4๋ ๊ตฌ์ฑ์์ ์ฝ๊ฒ ์ค๋ช
ํ๊ธฐ
(1) ์กํฐ๋นํฐ: ์ฌ์ฉ์์๊ฒ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ ๊ณต
(2) ์๋น์ค: ๋ฐฑ๊ทธ๋ผ์ด๋ ์กฐ์ ์ํ
(3) ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ: ์ฑ ๋ฐ์์ ์ผ์ด๋ ์ด๋ฒคํธ๋ฅผ ์ฑ์ ์ ๋ฌ
(4) ์ฝํ ํธ ํ๋ก๋ฐ์ด๋: ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ค๋ฅธ ์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํจ - ์กํฐ๋นํฐ ์๋ช ์ฃผ๊ธฐ ์ค onPause()๋ ์ง์๋๋ ์๊ฐ์ด ๊ต์ฅํ ์งง์ผ๋ฏ๋ก, ์ฌ๊ธฐ์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ฑฐ๋ ๋คํธ์ํฌ ํธ์ถ์ ํ๋ ๋ฑ ์ค์ํ๊ฑฐ๋/์ค๋๊ฑธ๋ฆฌ๋ ์์ ์ ํ๋ฉด ์ ๋จ. (๋ค์ ์ฝ๋ฐฑ์ธ onStop() ์์ ํ์ฉ)
- ์ด ์ฑํฐ ๋ํ ๋๋ถ๋ถ์ด ์๋ ๋ด์ฉ์ด์๋ค.
5. ํ๋ฉด ๊ตฌ์ฑํ๊ธฐ (๋ทฐ(์์ ฏ))
- ๋ทฐ = ์ฑ์์ ์ฐ๋ฆฌ๊ฐ ๋์ผ๋ก ๋ณผ ์ ์๋ ๋ชจ๋ ๊ฒ (๋ฒํผ, ์ด๋ฏธ์ง, ๋ฆฌ์คํธ, ์
๋ ฅ์ฐฝ ๋ฑ = ์์ ฏ ์ด๋ผ๊ณ ๋ ๋ถ๋ฆผ)
๋ทฐ๊ทธ๋ฃน = ๋ ์ด์์์ด๋ฉฐ ๋ทฐ ๊ทธ๋ฃน ๋ํ ๋ทฐ์ ์ํจ (๋ฆฌ๋์ด ๋ ์ด์์, ์ปจ์คํธ๋ ์ธํธ ๋ ์ด์์ ๋ฑ) - 151ํ์ด์ง๊น์ง ๊ณต๋ถํ์๊ณ , ๋ด์ผ ๋ค์ ์ด์ด์ ๊ณต๋ถํ ์์ ์ด๋ค.
+ ์๋ณธ์ฃผ์ 1๋ถ ๋ด์ฉ ์ ๋ฆฌ (ํ ์์ผ ์ํ)
- ํ ์์ผ์ 1์๊ฐ 20๋ถ๋์ ์ ๋ฆฌํ๋ ๋ด์ฉ์ด๋ค.
- ์๋ณธ์ฃผ์ ์์คํ ์ ์ข ์๋ ์ฌ๋์ผ๋ก์, ๋ด๊ฐ ๋ชธ๋ด๊ณ ์๋ ์์คํ ์ ๋ํ ์ดํด๋ ํ์๋ผ๊ณ ์๊ฐํ๋ค.
- ํ ๋ฒ ์ ๋ฆฌํ๊ณ ๋ด์ฉ์ ๋ค์ ํ๋๋ฐ 1์๊ฐ ์ ๋๊ฐ ๊ฑธ๋ ค์ 2๋ถ๋ ๋ด์ผ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
- ํํ๋ผ๋ ๊ฒ์ด ์์ ํ๋ค๊ณ ์๊ฐํ ์ ์ด ์์๋๋ฐ, ์ฌ์ค์ ๋ด๊ฐ ๊ธฐ๋ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ญ์ฌ๊ฐ ์งง๊ณ ๋ถ์จํ ๊ฒ์ด๋ผ๋ ๊ฑธ ๋๊ผ๋ค. ๋๋ถ์ด ์ฌํ ์ ๋์นด๋ชจํ ๊ฐ ๋นํธ์ฝ์ธ์ ๋ง๋ค๊ณ ๋ฐํํ ์ง์ ์ ์ธ ์ด์ (ํ์ค์ํ)์ ๋ํด์๋ ์๊ฐํ๊ฒ ๋์๋ค.
- ๊ฒฐ๊ตญ ๋ชจ๋ ๊ฒ ์ค์ ๋ก ์กด์ฌํ๋ ๋์ด ์๋๊ณ , ๋น์ด๋ฉฐ, ๋ฐ์ดํฐ์ผ ๋ฟ์ด๋ผ๋ฉด ๊ธฐ์ถํตํ๊ฐ ๋ฐ๋์ ๋ฌ๋ฌ์ฌ์ผ๋ง ํ ๊น?
- ๊ทธ๋ฆฌ๊ณ ํ๊ตญ์ ํ์ดํผ์ธํ๋ ์ด์ ์ด ์ค์ง ์์ผ๋ฆฌ๋ ๋ณด์ฅ์ด ์์๊น?
๐ญ Retrospect
์ค๋์ ์ ๋ง ์์นจ 8์๋ถํฐ ํ๋ฃจ์ข
์ผ ์ง์คํ ๋ ์ธ๋ฐ, ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ์ ๋ทฐํ๋ ๋ฐ ์ด๋ํฐ์ ๋ํ ์ง์์์ด ๋ฐ๋ก ์คํ ๋ค๋๋ฐ ๊ณผ์ ๋ฅผ ๊ตฌํํ๋ ค๋ ์ฝ์ง์ ๋ง์ด ํ๊ณ ์ ์ข ๋จน์๋ค.
Exception์ ์ข
๋ฅ๋ ์๊ฐ๋๋ฉด ๋ฐ๋ก ์ ๋ฆฌํด๋ณด๊ณ ์ถ๊ณ , ํฐ์คํ ๋ฆฌ ๊ฒ์ ๊ธฐ๋ฅ๋ ๋นจ๋ฆฌ ๊ณ ์ณ์ผ ํ๋ค. ํ ๊ฒ ์์ฌ๊ฐ์ ๋ฏธ๋ฃจ๊ณ ์๊ธด ํ๋ฐ ๊ณต๋ถ ๋ธ๋ก๊ทธ์ ๊ฒ์ ๊ธฐ๋ฅ์ด ์๋ค๋ ๊ฒ ๋ง์ด ๋๋์ง...
โ