Kotlin let, run, also, apply, with

이 자습서에서는 Kotlin에서 사용할 수있는 몇 가지 중요한 표준 라이브러리 함수를 구현할 것입니다. kotlin-stdlib는 우리에게 관용적인 패턴을 구현하는 유용한 고차 함수를 제공합니다. Kotlin에서 프로그래밍을 훨씬 쉽고 빠르게 만드는 방법을 살펴보겠습니다. 아래에서 논의 할 함수는 다음과 같습니다:

  • let
  • run
  • also
  • apply
  • with

Kotlin let

let은 호출된 개체를 매개 변수로 사용하고 람다 표현식의 결과를 반환합니다. Kotlin let은 변수가 표현식 내에서 선언되었을 때 외부에서 사용할 수 없는 스코핑 함수입니다. Kotlin let 함수를 보여주는 예제는 아래에 제공됩니다.

fun main(args: Array) {
    var str = "Hello World"
    str.let { println("$it!!") }
    println(str)

}
//Prints
//Hello World!!
//Hello World

it 키워드는 let 내부의 속성의 복사본을 포함합니다. 아래에 표시된대로 마지막으로 let에서 반환된 값을 인수로 반환합니다.

var strLength = str.let { "$it function".length }
println("strLength is $strLength") //prints strLength is 25

체이닝 let 함수

var a = 1
var b= 2

a = a.let { it + 2 }.let { val i = it + b
        i}
println(a) //5

당신이 볼 수 있듯이, 우리는 두 번째 let 함수 내에서 로컬 변수 “i”를 선언했습니다. let 함수의 마지막 문장을 i로 설정하면 해당 속성이 외부 속성 a로 반환됩니다.

중첩 let

아래에 표시된 대로 다른 let 표현식 내에 let 표현식을 설정할 수 있습니다.

var x = "Anupam"
x.let { outer -> outer.let { inner -> print("Inner is $inner and outer is $outer") } }

//Prints
//내부는 Anupam이고 외부는 Anupam입니다.

중첩된 let의 경우 it 키워드를 사용할 수 없습니다. 두 let 함수에 대해 명시적인 이름을 it에 할당해야 합니다. 가장 바깥쪽 let만 값을 반환합니다.

var x = "Anupam"
    x = x.let { outer ->
        outer.let { inner ->
            println("Inner is $inner and outer is $outer")
            "Kotlin Tutorials Inner let"
        }
        "Kotlin Tutorials Outer let" 
    }
    println(x) //prints Kotlin Tutorials Outer let

null 확인용 let

추가로, let은 아래에 표시된 대로 Nullable 속성을 확인하는 데 유용합니다.

var name : String? = "Kotlin let null check"
name?.let { println(it) } //prints Kotlin let null check
name = null
name?.let { println(it) } //nothing happens

let 표현식 내의 코드는 속성이 null이 아닐 때만 실행됩니다. 따라서 let은 우리를 if else null 확인기로부터 구해줍니다!

Kotlin 실행

Kotlin의 run 함수는 또 다른 흥미로운 기능입니다. 다음 예제는 그 사용 사례를 보여줍니다.

var tutorial = "This is Kotlin Tutorial"
    println(tutorial) //This is Kotlin Tutorial
    tutorial = run {
        val tutorial = "This is run function"
        tutorial
    }
    println(tutorial) //This is run function

Kotlin의 run 표현식은 외부 속성을 변경할 수 있습니다. 따라서 위의 코드에서는 로컬 범위에 대해 재정의했습니다.

  • let 함수와 유사하게, run 함수도 마지막 문을 반환합니다.
  • let과는 달리, run 함수는 it 키워드를 지원하지 않습니다.

let과 run

let과 run 함수를 함께 결합해 봅시다.

var p : String? = null
    p?.let { println("p is $p") } ?: run { println("p was null. Setting default value to: ")
        p = "Kotlin"}

    println(p)
//Prints
// p가 null이었습니다. 기본값 설정: 
//Kotlin

Kotlin도

이름에서 알 수 있듯이, also 표현식은 호출된 객체에 대해 추가 처리를 수행합니다. let과 달리 새로운 반환 데이터가 아닌 원래 객체를 반환합니다. 따라서 반환 데이터는 항상 동일한 유형을 갖습니다. let과 마찬가지로, alsoit을 사용합니다.

var m = 1
m = m.also { it + 1 }.also { it + 1 }
println(m) //prints 1 

Kotlin let vs also

다음 코드 스니펫은 letalso를 구분하는 좋은 예를 보여줍니다.

data class Person(var name: String, var tutorial : String)
var person = Person("Anupam", "Kotlin")

var l = person.let { it.tutorial = "Android" }
var al = person.also { it.tutorial = "Android" }
    
println(l)
println(al)
println(person)

위의 코드에서는 데이터 클래스를 사용했습니다. also 표현식은 데이터 클래스 객체를 반환하고 let 표현식은 명시적으로 아무것도 지정하지 않았으므로 아무것도 반환하지 않습니다 (Unit).

Kotlin apply

Kotlin apply는 유형에 대한 확장 함수입니다. 이것은 객체 참조(수신자로도 알려짐)에서 표현식으로 실행되고 완료되면 객체 참조를 반환합니다.

data class Person(var name: String, var tutorial : String)
var person = Person("Anupam", "Kotlin")

person.apply { this.tutorial = "Swift" }
println(person)

apply vs also

data class Person(var n: String, var t : String)
var person = Person("Anupam", "Kotlin")

person.apply { t = "Swift" }
println(person)

person.also { it.t = "Kotlin" }
println(person)

참고: apply에서는 it을 사용할 수 없습니다. 데이터 클래스의 속성 이름이 함수 내에서 고유하면 this를 생략할 수 있습니다. this를 가리키지 않을 때만 also를 사용해야 합니다.

Kotlin으로

apply와 마찬가지로 with는 매번 참조에 대한 점 연산자를 호출할 필요 없이 인스턴스 속성을 변경하는 데 사용됩니다.

data class Person(var name: String, var tutorial : String)
var person = Person("Anupam", "Kotlin")

with(person)
    {
        name = "No Name"
        tutorial = "Kotlin tutorials"
    }

다시 말해, with는 몇 가지 차이를 제외하고 apply와 유사합니다.

Kotlin apply vs with

  • with는 객체(수신자) 없이 실행되지만, apply는 객체가 필요합니다.
  • apply는 객체 참조에서 실행되지만, with는 그것을 인수로 전달합니다.
  • with 함수의 마지막 표현식은 결과를 반환합니다.
var xyz = with(person)
    {
        name = "No Name"
        tutorial = "Kotlin tutorials"
        val xyz = "End of tutorial"
        xyz
    }
    println(xyz) //End of tutorial

이로써 Kotlin 표준 함수로 변수를 변경하거나 함수 내에서 객체를 수정하는 데 필요한 것이 전부입니다.

Source:
https://www.digitalocean.com/community/tutorials/kotlin-let-run-also-apply-with