이 자습서에서는 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
과 마찬가지로, also
도 it
을 사용합니다.
var m = 1
m = m.also { it + 1 }.also { it + 1 }
println(m) //prints 1
Kotlin let vs also
다음 코드 스니펫은 let
과 also
를 구분하는 좋은 예를 보여줍니다.
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