[Android Kotlin] apply, with, let, also, run 정리

DoooongDong·2022년 1월 8일
0

Android Kotlin

목록 보기
3/11
post-thumbnail

Scope functions

코틀린 표준 라이브러리는 객체의 context 내에서 코드 블록을 실행하는 것을 목적으로 하는 몇 가지 함수들이 있다. 객체에서 이러한 함수들을 호출하게 되면 임시 범위가 된다.

apply

fun <T> T.apply(block: T.() -> Unit): T

apply 는 T 를 수신기로 사용하고 반환값이 자기 자신인 T 다. 또한 apply 는 블럭 함수의 입력을 람다 리시버로 받았기 때문에 블럭 안에서 객체의 property 를 호출할 때 it 이나 this를 사용하지 않아도 된다.

//apply 를 사용하는 경우
val adam = Person("Adam").apply {
    age = 32	
    city = "London"
}
println(adam)
//apply 를 사용하지 않는 경우
val adam = Person()
adam.age = 32
adam.city = "London"

apply 는 객체의 함수를 사용하지 않고 자기 자신을 다시 반환할 때 사용되기 때문에 주로 객체의 초기화나 변경 할 때 사용한다.

with

fun <T,R> with(receiver: T, block: T.() -> R): R

with은 객체가 인수로 전달되고 람다 내부에서 수신기로 사용할 수 있다.

//예제1
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
	println("'with' is called with argument $this")
    	println("It contains $size elements")
}

예제1에서 with으로 numbers 를 받으면 바로 리스트에 접근할 수 있게 된다.withnon-null 객체를 사용하고 블럭의 반환값이 필요하지 않을 때 사용된다.

let

fun <T, R> T.let(block: (T) -> R): R

letT 의 확장함수이며 객체를 it 으로 사용할 수 있고 반환값은 람다 식의 결과다.

//Person(name, age)
val person = Person("", 0)
val resultIt = person.let {
	it.name = "han"
    	it.age = 25
    	it //(T) -> R 에서 반환값이 R을 나타낸다.
}

val resultStr = person.let {
	it.name = "kwan"
    	it.age = 24
    	"{$name is $age}" //(T) -> R 에서 반환값이 R을 나타낸다.
}

println("$resultIt") //Person(name=han, age=25)
println("$resultStr") //kwan is 24

let 함수를 사용해서 위와 같이 객체의 상태를 변경할 수 있다.

val name = person?.let { it.name} ?: "이름없음"

letT?.let { } 형태로 블럭 안을 non-null 인지 확인할 수 있으므로 아주 유용하다. 객체를 선언할 때는 ?: 를 사용하여서 null이라면 초기화를 시켜줄 수 있다.

also

fun <T> T.also(block: (T) -> Unit): T
alsoT 의 확장함수이며 객체를 it으로 사용할 수 있다. 반환값은 객체 자체다.

val numbers = mutableListOf("one", "two", "three")
numbers
    .also { 
    	println("The list elements before adding new one: $it") 
    }
    .add("four")

also 는 객체의 속성을 전혀 사용하지 않거나 변경하지 않고 사용하는 경우에 사용된다.

run

fun <T, R> T.run(block: T.() -> R): R

run 은 객체를 수신기로 사용할 수 있으며 반환값을 람다식의 결과다.

val person = Person("han" , 25)
val nextAge = person.run{
	age++
}
println($nextAge)
// 26

run 은 값을 계산할 때나 여러 개의 지역변수 범위를 제한할 때 사용한다.

참고자료:

  1. https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%9D%98-apply-with-let-also-run-%EC%9D%80-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80-4a517292df29

  2. https://blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html

  3. https://kotlinlang.org/docs/scope-functions.html#also

profile
꺾이지 말자 :)

0개의 댓글