Hello, Android!

고차함수를 호출하는 방법 본문

Kotlin

고차함수를 호출하는 방법

lwndnjs93 2020. 2. 24. 22:08

함수를 호출하는 방법으로는 크게 값에 의한 호출(call by value)

주소에 의한 호출(call by reference)가 있다 

값에 의한 호출은 함수 호출시 값을 직접 넘겨주는 방식이고

주소에 의한 호출은 함수에서 참조 가능한 주소를 넘겨주는 방식이다

하지만 자바, 코틀린에서는 값에 의한 호출이 일반적으로 사용되며, 주소에 의한 호출은 사용되지 않는다

다만 코틀린에서는 람다식을 사용하여 확장된 호출 방식을 사용할 수 있다

 

- 값에 의한 호출

위 코드를 실행하면 

getAgelamda -> howOld -> 20 이 출력된다 

그 이유는 4번 줄에서 getAgeLambda() 함수가 실행된 뒤 그 값을 howOld()함수에 전달한다

howOld()함수는 println을 실행하고 매개변수 age를 반환하게 되기 때문이다

즉 howOld()의 첫번째 매개변수가 Int이기 때문에 람다함수 실행 결과값을 받는 call by value가 된다

 

- 이름에 의한 참조

이번에는 실행 결과가 위와 다르게 나온다

howOld -> getAgeLambda -> 20 으로 실행 순서가 다른게 나왔다

이렇게 순서가 다른 이유는 howOld함수의 매개변수가 Int가 아닌, 매개변수는 없고 반환값이 Int인 람다식을 받는다

그렇기 때문에 함수 호출시 getAgeLambda()가 아닌 getAgeLambda로 람다식 자체를 넘겨주게되어

howOld()함수가 먼저 호출되고 println을 한 뒤 매개변수로 넘겨받은 age 람다식을 호출하게 된다

 

이와같이 값에 의한 참조와 이름에 의한 참조를 적절하게 사용하면 원하는 타이밍에 

필요할때만 람다식이 호출되도록 만들 수 있다

 

- 일반 함수의 참조 호출

우선 이름(String)과 나이(Int)를 입력받아 출력하는 introduceLambda()라는 일반 함수와

이름과 나이, 람다식을 매개변수로 받아 람다식에 넘겨주는 함수가 있다

이전에 했던 값에 의한 호출을 하게 되면 매개변수는 람다식을 받지만

마지막 인자로 introduce()결과값을 넘겨주기 때문에 Type mismatch가 발생한다

그렇다면 이름에 의한 참조를 하면 어떻게 될까?

이렇게 되면 nameAge에서 마지막 매개변수는 람다식 이지만, introdeceLambda는 일반 함수이기 때문에

인자로 넘겨줄 수 없다

 

이렇게 람다식에 일반 함수를 이름에 의한 참조를 통해 넘겨주기 위해서는 :: 을 사용해야 한다

위와 같이 마지막 인자로 ::introdeceLambda 를 넘겨주게 되면 람다식을 이름에 의한 참조를 한 결과와 동일하다

다만 일반 함수를 이름에 의한 참조를 하기 위해서는 호출하는 함수의 매개변수와

인자가 되는 함수의 매개변수와 반환값의 모습이 동일해야한다

즉 nameAge함수의 매개변수 람다식은 String과 Int를 매개변수로 받고 반환 값이 없는(UInit)인 람다식이고

인자로 넘겨주는 introduceLambda()함수는 Stirng, Int가 매개변수이고 반환 값이 없다

이렇게 introduceLambda()와 람다식의 매개변수의 수, 타입, 반환값이 동일하기 때문에 :: 를 이용하여

일반 함수이지만 람다식에 인자로 넘겨줄 수 있다

'Kotlin' 카테고리의 다른 글

인라인 함수  (0) 2020.03.01
익명함수  (0) 2020.03.01
고차함수  (0) 2020.02.24
람다식  (0) 2020.02.24
함수형 프로그래밍  (0) 2020.02.24