PersesTitan(페르) 기술블로그

[Kotlin] apply, also, run, with, let 정리 본문

Language/Kotlin

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

PersesTitan(페르) 2023. 9. 16. 14:23

코틀린에서는 apply, also, run, with, let라는 범위지정함수를 지원하는데 해당 함수를 사용하여 코드를 간편하게 만들 수 있게 해줍니다.

각 함수 특징 정리

함수명 접근 방식 반환 값 사용처 기타
apply this 수신 객체 객체의 값 변경  
also it(지정한 변수명) 수신 객체 apply와 유사 객체 관련 동작실행등에 사용됨
run this 반환 타입 수신 객체를 이용해 값을 반환  
with this 반환 타입 run과 동일 단, 수신 객체를 파라미터로 받음
let it(지정한 변수명) 반환 타입 run, with와 동일 null check가 가능

예시로 사용될 클래스

해당글은 TestItem class을 예시로 작성하였습니다.

class TestItem {  
    var a: Int = 0
    var b: String = "Kotlin"
}

 

apply

apply는 객체의 값을 변경할 때 많이 사용합니다. 객체의 값을 지정하고 자신의 값을 반환하기 때문에 생성 후 원하는 값을 변경하여 바로 변수나 값을 반환할 수 있어 깔끔한 코드 작성을 가능하게 해줍니다.

val item: TestItem = TestItem().apply {
    a = 1234
    b = "HelloWorld"
}

println(item.a)
println(item.b)

// 출력
// 1234
// HelloWorld

 

also

also는 객체관련 동작 및 실행에서 사용합니다. apply와 같이 자기 자신을 리턴하기 때문에 반환 값이나 변수에 바로 넣어서 사용할 수 있습니다. apply는 객체의 값을 변경하는데 사용하지만 also는 변환과 해당 객체와 관련된 동작까지 하는데 사용합니다.

TestItem().also { item ->
    println(item.a)
    println(item.b)
}

// 출력
// 0
// Kotlin

 

run

run는 apply와 같은 동작을 하지만 마지막 라인의 타입을 반환하는 특징이 있습니다. 객체를 이용하여 바로 특정 타입으로 반환할때 유용하게 사용할 수 있습니다.

 

예제 코드에서는 a 값을 반환하여 value에 a 값을 저장하였지만 객체에 반환하는 함수를 불러와 사용하는 것도 가능하고 다양한 응용방법이 존재합니다.

val value: Int = TestItem().run {
    a = 1234
    b = "Hello World"
    a // 반환할 값
}
println(value)

// 출력
// 1234

 

with

with는 run과 동일하지만 객체를 파라미터형태로 넘겨준다는 차이가 있습니다. 동작은 사실 상 run과 동일하기 때문에 원하는 것을 골라서 사용하면 됩니다.

 

위에 run의 코드와 동일한 동작이지만 수신 객체를 파라미터로 넘겨주는 특징이 존재합니다.

val value: Int = with(TestItem()) {
    a = 1234
    b = "Hello World"
    a // 반환할 값
}

println(value)

// 출력
// 1234

 

let

let은 run과 with과 동작은 동일하지만 Safe Call(?.)를 사용하여 null체크를 하는 용도로도 많이 사용합니다. 접근 방식은 run, with와는 다르게 사용자가 지정한 변수명으로 수신 객체에 접근한다는 차이도 존재합니다.

 

아래 코드와 같이 수신 객체가 null이 아닐때만 값 변경 및 동작 실행을 할 수 있습니다. let또한 run, with와 같이 반환 값이 존재하기 때문에 수신 객체가 null일 경우 값이 null이 저장될 수 있으므로 해당 부분은 주의하여 사용하여야 할 것 같습니다.

var item: TestItem? = null
item?.let { test ->
    test.a = 1234
    test.b = "Hello World"
}