[Kotlin] invoke 함수는 무엇일까 ?

고럭키·2021년 9월 15일
5

Kotlin

목록 보기
1/2

코틀린 기본 개념을 한 번 쭉 정리하고 싶어서 부스트코스 - 코틀린 프로그래밍 강의를 쭉 듣고 있다.

이제 함수형 프로그래밍과 관련된 내용까지 수강하였는데, 그 과정에서 invoke 함수에 대해서 정리를 해두고 싶어서 이 포스팅을 작성하게 되었다.

invoke란 ?

이름 없이 간편하게 호출될 수 있는 함수

이렇게만 봐서는 무슨 말인지 잘 이해가 가지 않을 수 있다. 예시를 살펴보자 !

class Test{
    operator fun invoke(str: String){
        print(str)
    }
}

fun main(){
    val test = Test()
    test("wow")
}

예시 코드를 살펴보면, Test라는 클래스에 인자로 받은 문자열을 출력하는 invoke 함수를 선언해두었다.
이를 사용하는 main 함수에서 이를 호출하기 위해서 test.invoke(str) 형태로 호출해야 할 것 같지만 이름 없이 간편하게 호출될 수 있는 함수 invoke이기 때문에 test(str)과 같이 함수 이름을 생략할 수 있다 !

operator 키워드

위의 예시에서 invoke 함수의 선언부를 보면 앞에 operator 키워드가 붙은 것을 알 수 있다. 이것이 어떤 키워드인지 알아보자 !

operator ( 연산자 )
코틀린은 이름을 부여한 함수임에도 불구하고 실행을 간편하게 할 수 있는 연산자라는 것을 제공한다. 이러한 연산자의 예시로는 +, - 부터 invoke까지 있는데, 이러한 연산자를 overloading할 수 있도록 제공하는 키워드가 바로 operator이다 !

람다와 invoke

invoke 함수에 대해서 궁금증을 가지게 된 것이 람다를 공부하면서였다. 람다와 invoke는 어떤 관계인지 알아보자 !

람다는 컴파일되면서 코틀린에 정의된 FunctionN(P1, .. ,PN, R) 형태로 변환된다. ( 이때, N은 인자의 수를 의미한다. 0개도 가능 ! ) 이 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()
        }
}

위의 코드를 보면 (Int) -> String 형태의 람다가 Function1<Int, String> 형태로 변환되고, 구현 내용이 override된 invoke 함수로 들어가는 것을 확인할 수 있다.

이처럼 변환되기 때문에 꼭 convert.invoke(2) 와 같이 호출하지 않고, convert(2) 와 같이 간편한 형태로 호출할 수 있는 것이다 ! invoke 함수로 구현되어 있기 때문에 !

[ 참고 자료 ] https://wooooooak.github.io/kotlin/2019/03/21/kotlin_invoke/

0개의 댓글