티스토리 뷰

app/kotlin

[kotlin/코틀린] 영역 함수

hrniin 2023. 7. 19. 23:13
728x90

 

영역 함수

  • 영역 함수를 통해 지역 변수를 명시적으로 선언하지 않고 식의 값이 들어있는 영역을 정의해서 코드를 단순화할 수 있다.
  • 모든 영역 함수는 인라인 함수이기 때문에 런타임 부가 비용이 없다.

 

  1. 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
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함