본문 바로가기
Kotlin

[Kotlin] Scope functions(let, run, with, apply, also)

by LoseyKim 2024. 3. 5.
Scope function(범위 지정 함수)은 객체의 컨텍스트에서 코드 블록을 실행하고 해당 객체를 참조할 수 있는 함수
let, run, with, apply, also
    함수 수신 객체 반환 값 확장함수 여부
    let it 람다 O
    run this 람다 O
    with this 람다 X
    apply this 객체 O
    also it 객체 O

    let

    • nullable한 객체를 안전하게 처리할 때 주로 사용
    • 객체가 null이 아닌 경우에만 코드 블록이 실행
    val strNull: String? = null
    val str: String? = "Hello"
    
    val lengthNull = strNull?.let { 
        //실행 안 됨
        println("let() called on $it")        
        processNonNullString(it)
        it.length
    }
    
    val length = str?.let { 
        //실행 됨
        println("let() called on $it")        
        processNonNullString(it)
        it.length
    }
    
    //출력
    let() called on Hello

    수신 객체 : it(생략 불가)

    반환 값 : 마지막 줄


    with

    • 객체의 여러 속성을 한꺼번에 사용하고자 할 때 주로 사용
    • 결과 값이 필요하지 않은 경우 컨텍스트 객체에서 함수를 호출할 때
    • 확장 함수가 아님
    val numbers = mutableListOf("one", "two", "three")
    with(numbers) {
        println("'with' is called with argument $this")
        println("It contains $size elements")
    }
    
    val firstAndLast = with(numbers) {
        "The first element is ${first()}," +
        " the last element is ${last()}"
    }
    println(firstAndLast)
    
    //출력
    'with' is called with argument [one, two, three]
    It contains 3 elements
    The first element is one, the last element is three

    수신 객체 : this(생략 가능)

    반환 값 : 마지막 줄


    run

    • with와 같은 동작을 하지만 확장 함수로 구현
    • 람다가 객체를 초기화하고 계산 후 결과를 반환할 때
    val service = MultiportService("https://example.kotlinlang.org", 80)
    
    val result = service.run {
        port = 8080
        query(prepareRequest() + " to port $port")
    }
    
    //출력
    Result for query 'Default request to port 8080'

    수신 객체 : this(생략 가능)

    반환 값 : 마지막 줄


    apply

    • 객체의 속성을 변경하거나 초기화할 때 사용
    val adam = Person("Adam").apply {
        age = 32
        city = "London"        
    }
    println(adam)
    
    //출력
    Person(name=Adam, age=32, city=London)

    수신 객체 : this(생략 가능)

    반환 값 : 객체 자체


    also

    • 객체를 변경하지 않고 객체의 속성을 로깅하거나 다른 동작을 수행할 때 사용
    val numbers = mutableListOf("one", "two", "three")
    numbers
        .also { println("The list elements before adding new one: $it") }
        .add("four")
        
    //출력
    The list elements before adding new one: [one, two, three]

    수신 객체 : it(생략 불가)

    반환 값 : 객체 자체


    참고문서

    https://kotlinlang.org/docs/scope-functions.html

     

    Scope functions | Kotlin

     

    kotlinlang.org