1. ๋ฒ์ ์ง์ ํจ์
ํน์ ๊ฐ์ฒด์ ๋ํ ์์ ์ ๋ธ๋ก ์์ ๋ฃ์ด ์คํํ ์ ์๋๋ก ํ๋ ํจ์.๋ธ๋ก์ ํน์ ๊ฐ์ฒด์ ๋ํด ํ ์์ ์ ๋ฒ์๊ฐ ๋จ. let, run, apply, also, with ๋ฑ 5๊ฐ์ง ๊ธฐ๋ณธ์ ์ธ ๋ฒ์ ์ง์ ํจ์๋ฅผ ์ง์ํจ. ๋ฒ์ ์ง์ ํจ์๋ ์์ ๊ฐ์ฒด ์ง์ ๋๋ค ํจ์๋ผ๊ณ ๋ถ๋ฆ
2. apply
์์ ๊ฐ์ฒด ๋ด๋ถ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ค์ ์์ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํจ์. ๊ฐ์ฒด ์์ฑ ์์ ๋ค์ํ ํ๋กํผํฐ๋ฅผ ์ค์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋จ. apply์ block์ ๋๋ค์์ ์์ ๊ฐ์ฒด๋ก apply์ ์์ ๊ฐ์ฒด๋ฅผ ์ง์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค์ ๋ด๋ถ์์ ์์ ๊ฐ์ฒด์ ๋ํ ๋ช ์๋ฅผ ๊ตณ์ด~ ํ์ง ์๊ณ ํจ์๋ฅผ ํธ์ถํ ์ ์๊ฒ ๋จ.
์ฝ๋ ์์ ๋ณด๋ฉด … ์ด๊ฒ ๋ง๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง T.apply ํ์์ผ๋ก ์ฌ์ฉํ๋ฉฐ ๋ด๋ถ์ block ๋๋ค์์ ๋ฐํ์์ด Unit์. ๊ทผ๋ฐ .apply ์์ฒด์ ๋ฐํ์ ๋๋ค์์ ๋ชจ๋ ์ ์ฉํ ์ค์ค๋ก์ ๊ฐ์ฒด๊ฐ ๋ฐํ๋จ์ ์ ์ ์์. ๊ทธ๋์ type๋ T๊ณ , ๋ง์ง๋ง์ return this๋ฅผ ์ฌ์ฉํจ.
3. run
run์ apply์ ๊ฐ์ด ๋์ํ์ง๋ง! ์์ ๊ฐ์ฒด๋ฅผ returnํ์ง ์๊ณ , run block์ ๋ง์ง๋ง ์ค์ Returnํ๋ ๋ฒ์ ์ง์ ํจ์์. ์์ ๊ฐ์ฒด์ ๋ํด ํน์ ํ ๋์์ ์ํํ ํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํด ๋ฐ์์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ. ์ ๋ง์ง๋ง ์ค์ด Return ๋๋๋ฉด block()์ด ๋๋ค์์ธ๋ฐ return block()์ ํ๋ฉด ๋๋ค์์ ๊ฐ์ฅ ๋ง์ง๋ง ํํ์์ด ๋ฆฌํด๋๊ธฐ ๋๋ฌธ.
์๋๋ ์ค์ต ์์๋ก, Person data class์ ํจ์๋ก isAdult()๋ฅผ ๋์์. ๊ทธ๋ฆฌ๊ณ Person ๊ฐ์ฒด p1์ ๋ฒ์ ์ง์ ํจ์ run์ ์ฌ์ฉํด์ age ์ค์ ํด์ฃผ๊ณ isAdult()๋ฅผ ์คํํด์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ๋ณ์์ ์ ์ฅํ๋ ์์ ์ ํจ. ๊ทธ๋ฌ๋๊น ์์ ๊ฐ์ฒด์ ๋ํด ํน์ ํ ๋์์ธ age ์ค์ ์ ํด์ฃผ๊ณ isAdult()์ ๋ํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํ run์ ์ฌ์ฉ ์์์.
data class Person(
var name: String = "",
var age: Int = 0
) {
fun isAdult(): Boolean {
if(this.age > 19)
return true
else
return false
}
}
fun main() {
val p1 = Person()
var isp1Adult = p1.run {
age = 13
isAdult()
}
println("p1 age 13 is Adult: $isp1Adult")
isp1Adult = p1.run {
age = 23
isAdult()
}
println("p1 age 23 is Adult: $isp1Adult")
}
4. run vs apply
data class Person(
var name: String = "",
var age: Int = 0
)
fun main() {
val p1 = Person()
val p2 = p1.run {
name = "dd"
age = 10
"23"
}
val p3 = p1.apply {
name = "ej"
age = 23
}
println("p2: ${p2.toString()}") //p2: 23
println("p1: ${p1.toString()}") //p1: Person(name=ej, age=23)
println("p3: ${p3.toString()}") //p3: Person(name=ej, age=23)
//p2๋ p1.run์ ์ํํ ๊ฒฐ๊ณผ์ธ๋ฐ .run์ ์์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๊ฒ ์๋๊ณ
//run ๋ธ๋ก์ ๊ฐ์ฅ ๋ง์ง๋ง ๋ผ์ธ์ ๋ฐํํ๊ฒ ๋จ
//๋ฐ๋ผ์ 23์ด ๋ฐํ๋จ. ๋ง์ฝ "23"์ด ์๋ค๋ฉด kotlin.Unit์ ๋ฐํํ๊ฒ ๋จ
p3.apply {
name = "not ej"
age = 13
}
println("p1: ${p1.toString()}") //p1: Person(name=not ej, age=13)
println("p3: ${p3.toString()}") //p3: Person(name=not ej, age=13)
//apply๊ฐ ์๊ธฐ ์์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฏ๋ก p3๋ฅผ ๊ณ ์น๋ฉด p1๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ
//์ฐธ์กฐํ๋ฏ๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์
}
5. with
with๋ ์์ ๊ฐ์ฒด์ ๋ํ ์์ ํ ๋ง์ง๋ง ๋ผ์ธ์ returnํจ. run๊ณผ ์์ ํ ๋๊ฐ์ด ๋์ํจ. ๋ค๋ฅธ ์ ํ๋๋ run์ ํ์ฅ ํจ์๋ก ์ฌ์ฉ๋์ง๋ง with๋ ์์ ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ฌ์ฉํ๋ค๋ ์ ์. run์ ์ฌ์ฉํ๋๊ฒ ๋ ๊น๋ํด์ with๋ ์ ์ฌ์ฉ๋์ง ์์.
์๋์ ์ฝ๋๊ฐ ์์ 2๋ฒ์ ์๋ run example๊ณผ ๋์ผํ๊ฒ ์๋ํ์ง๋ง ๊ฐ๋ ์ฑ์ ์ข์ง ์๋ค๊ณ ํจ…
data class Person(
var name: String = "",
var age: Int = 0
) {
fun isAdult(): Boolean {
if(this.age > 19)
return true
else
return false
}
}
fun main() {
val p1 = Person()
var isp1Adult = with(p1) {
age = 13
isAdult()
}
println("p1 age 13 is Adult: $isp1Adult")
isp1Adult = with(p1) {
age = 23
isAdult()
}
println("p1 age 23 is Adult: $isp1Adult")
}
6. let
์์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ์์ ์ ํ ํ ๋ง์ง๋ง ์ค์ return ํ ๋ ์ฌ์ฉํจ. run, with์ ๋ฌ๋ฆฌ ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ทผํ ๋ it์ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ ๋ง ๋ค๋ฅด๊ณ ๋๋จธ์ง๋ ๊ฐ์. ํ์ง๋ง ์ค์ ์ฌ์ฉํ ๋ ์กฐ๊ธ์ฉ ๋ค๋ฆ.
๋ธ๋ก๊ทธ์์๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ๋ช ์ํด๋ .
- null check ํ ์ฝ๋๋ฅผ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ
- nullableํ ์์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ํ์ ์ ๋ณ์๋ก ๋ณํํด์ผ ๋๋ ๊ฒฝ์ฐ
๊ทธ๋ฌ๋ null checkํ ๋ ์ฐ์ง ๋ง๋ผ๋ ๋ค๋ฅธ ๋ธ๋ก๊ทธ ๊ธ๋ค๋ ์์. ์ผ๋จ null checkํด์ ์ฌ์ฉํ๋ ์์๋ ์๋์ ๊ฐ์. ๊ทธ๋ฆฌ๊ณ null checkํ ๋ ์ฐ๋ผ๋ ๋ธ๋ก๊ทธ์์๋ nullableํ ๊ฐ์๋ let์ ์ฌ์ฉํ ์๋ ์์ง๋ง ๋๋๋ก์ด๋ฉด run์ ์ฌ์ฉํ๋ผ๊ณ ์จ๋์
data class Person(
var name: String = "",
var age: Int = 0
) {
fun isAdult(): Boolean {
if(this.age > 19)
return true
else
return false
}
}
fun main() {
var p1: Person? = null
val isp1Adult = p1?.let { it ->
it.isAdult()
}
println(isp1Adult.toString()) //null
}
7. also
also๋ apply์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๊ฐ์ฒด ์์ ์ ๋ฐํํจ. apply๊ฐ ํ๋กํผํฐ ์ธํ ์ ํ ํ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํ๋๋ฐ๋ง ์ฌ์ฉ๋๋ค๋ฉด also๋ ํ๋กํผํฐ ์ธํ + ๊ฐ์ฒด์ ๋ํ ์ถ๊ฐ์ ์ธ ์์ ์ ํ ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํจ.
also์์์ ๋ธ๋ฝ์ ๋๋ค์์ ํ๋ผ๋ฏธํฐ๋ก (T)๋ฅผ ์ง์ ํ๋ฏ๋ก ๋ด๋ถ์์ ์์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋๋ it์ ์ฌ์ฉํด์ผ ํจ. ์๋ also ๊ตฌํ๋ถ ์ฝ๋๋ฅผ ๋ณด๋ฉด block ๋๋ค์์ ํ๋ผ๋ฏธํฐ๋ก T๊ฐ ์กด์ฌ. ๋ฐ๋ผ์ it์ ์ฌ์ฉ. ์ฌ์ฉํ์ง ์๊ณ ๋ด๋ถ ๊ฐ์ฒด์ ๋ํด ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ ๋ฐ์!
p1์ copy๋ฅผ ์ฌ์ฉํด์ผ ํจ. copy๋ฅผ ํ๋ฉด ๋ฐ๋์ง ์์ ๊ฐ์ฒด๊ฐ return ๋จ์ ๋ณด์ฅํ ์ ์์. ๊ทผ๋ฐ also ์ ์ ์ด๋ค๊ณ ํฉ๋๋ค…
8. ์์ฝ
this๋ก ์ ๊ทผ : ์๋ ์์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๋๋ค์์ ํ๋ผ๋ฏธํฐ๋ก ์ฃผ์ง ์๊ณ ๋๋ค์์ ์์ ๊ฐ์ฒด๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ |
it์ผ๋ก ์ ๊ทผ : ์๋ ๋๋ค์์ ํ๋ผ๋ฏธํฐ๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ธฐ ๋๋ฌธ |
|
์์ ๊ฐ์ฒด ์์ฒด๊ฐ ๋ฆฌํด๋จ | apply | also |
Block ๋ง์ง๋ง ํํ์์ด ํ ๋น | run with |
let |
๐ ์ถ์ฒ
[Kotlin] apply, run, with, let, also ์ฐจ์ด ํ ๋ฒ์ ์ ๋ฆฌํ๊ธฐ
์ฝํ๋ฆฐ ์ apply, with, let, also, run ์ ์ธ์ ์ฌ์ฉํ๋๊ฐ?
'CS > Android, Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Custom View (0) | 2023.04.15 |
---|---|
[Android] Data Binding (0) | 2023.04.15 |
[Android] MVVM (0) | 2023.04.13 |
[Android] ์๋๋ก์ด๋ ๋ฆฌ์์ค (0) | 2023.04.07 |
[Android] AOS ART, Garbage Collector ๋ฐฉ์ (0) | 2023.04.07 |