티스토리 뷰
728x90
영역 함수
- 영역 함수를 통해 지역 변수를 명시적으로 선언하지 않고 식의 값이 들어있는 영역을 정의해서 코드를 단순화할 수 있다.
- 모든 영역 함수는 인라인 함수이기 때문에 런타임 부가 비용이 없다.
- extension run()
class Foo {
var a: Int = 0
var b: String = ""
fun post(): String {
return "a = $a, b = $b"
}
}
fun main() {
val f = Foo().run {
a = 4
b = "abc"
post()
}
println(f)
}
- 확장 함수 형태이며, 람다의 결과를 반환한다.
- 일반적으로 객체 상태를 설정하고, 객체의 결과를 만들어낸다. → 지역 변수의 가시성을 세밀하게 제어할 수 있다.
2. run()
class Foo(val a: String, val b: String)
fun main() {
val f = run {
val a = readLine() ?: return
val b = readLine() ?: return
Foo(a, b)
}
}
- 확장 함수가 아닌 run()은 문맥 식이 없고 람다의 값만을 반환한다.
- run은 인라인 함수이므로 return을 사용할 수 있다. run 없이 블록을 사용하면 블록을 람다로 취급하기 때문에 return이 제대로 작동하지 않는다.
3. with()
class Foo(val a: Int, val b: String)
fun main() {
val f = with(Foo(4, "abc")) {
"a = $a, b = $b"
}
println(f)
}
- 확장 함수 타입이 아니므로 문맥 식을 with()의 첫 번째 인자로 전달한다.
- 일반적으로 멤버 함수와 프로퍼티에 대한 호출을 묶는 경우 사용한다.
4. let()
class Foo(val a: Int, val b: String) {
fun print(s: String) {
println(s)
}
}
fun main() {
val f = Foo(3, "abc").let {
it.print("Hello")
"a = ${it.a}, b = ${it.b}"
}
println(f)
}
- 문맥 식의 값은 람다의 인자로 전달되고 it을 통해 접근할 수 있다.
5. apply()
class Foo() {
var a: Int = 0
var b: String = ""
fun print() {
println("a = $a, b = $b")
}
}
fun main() {
Foo().apply {
a = 1
b = "abc"
}.print()
}
- 확장 함수이며, 자신의 receiver를 반환한다.
- 반환값 없이 객체의 상태를 설정하는 경우 사용한다.
6. also()
class Foo() {
var a: Int = 0
var b: String = ""
fun print() {
println("a = $a, b = $b")
}
}
fun main() {
Foo().also {
it.a = 1
it.b = "abc"
}.print()
}
- 인자가 하나 있는 람다를 파라미터로 받는다.
- it을 통해 접근할 수 있다.
함수 | 객체 참조 방식 | 반환값 | 확장 함수 여부 |
run | this | 람다 결괏값 | O |
run | - | 람다 결괏값 | X : 호출 객체 없이 호출함 |
apply | this | 호출 객체 | O |
let | it | 람다 결괏값 | O |
with | this | 람다 결괏값 | X : 호출 객체를 인자로 받음 |
also | it | 호출 객체 | O |
728x90
'app > kotlin' 카테고리의 다른 글
[kotlin/코틀린] 클래스 계층 (0) | 2023.07.19 |
---|---|
[kotlin/코틀린] 클래스 종류 (이넘 클래스, 데이터 클래스, 인라인 클래스) (0) | 2023.07.19 |
[kotlin/코틀린] 확장 (0) | 2023.07.19 |
[kotlin/코틀린] 고차 함수 (0) | 2023.07.19 |
[kotlin/코틀린] 객체 (0) | 2023.06.22 |