invoke란?
class Test{
operator fun invoke(str: String){
print(str)
}
}
fun main(){
val test = Test()
test("wow")
}
operator 키워드
- 코틀린은 이름을 부여한 함수임에도 불구하고 실행을 간편하게 할 수 있는 연산자라는 것을 제공한다. 이러한 예시로는 +, -부터 invoke까지 있는데, 이러한 연산자를 overloading할 수 있도록 키워드가 바로 operator입니다.
람다와 invoke의 관계
- 람다는 커파일되면서 코틀린에 정의된 FunctionN()형태로 변환된다. 이 Function 인터페이스에는 invoke만이 정의되어 있다.
// lambda
val convert = { x: Int -> x.toString() }
// compiled
val convert = object : Function1<Int, String> {
override fun invoke(p1: Int): String {
return p1.toString()
}
}
- 코드를 보면 Function1<Int, String> 형태로 변환되고, 구현 내용이 override된 invoke 함수로 들어가는 것을 확인할 수 있다.
- 그래서 convert.invoke(2)와 같이 호출하지 않고 convert(2)와 같이 간편한 형태로 호출할 수 있다.