header-img
Info :

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
๋”๋ณด๊ธฐ
CS/Android, Kotlin