본문 바로가기

kotlin, java, android

[Kotlin] First-class / Function types / Function literals / Lambda

Programming Language에서의 First-class란?

다음 3가지 조건을 만족하는 경우, first-class가 된다.

① 변수와 자료구조에 저장될 수 있어야 한다.
② 다른 함수에 인자로 전달될 수 있어야 한다.
③ 다른 함수로부터 return될 수 있어야 한다.

이때 등장하는 '다른 함수'를 high-order function이라 한다.

 

갑자기 이걸 왜 알아보고 있느냐 하면,

kotlin에서 function이 위의 3가지 조건을 모두 만족하는 first-class이기 때문이다!

 

이전 글에서 이야기한 kotlin의 function이 expression이라는 점과 연결되는 부분이다.

내가 익숙한 c에서도 함수가 인자로 전달되는 경우가 있는데, 이땐 함수 포인터가 전달되는 것이었다.

하지만 kotlin에서 함수가 인자로 전달된다는 건 함수 포인터가 아니라 함수 그자체가 value를 갖는 expression이라는 걸 내포한다.

 

Function types

kotlin에서 function types를 나타내는 syntax는 다음과 같다.

(A, B) -> C

(M) -> N

() -> S

() -> Unit

-> 왼쪽이 parameter, 오른쪽이 return값이다.

 

Function literals

함수 리터럴은 하나의 값으로써의 함수를 의미한다.

kotlin에서 function literals를 나타내는 방법으로는 2가지가 있다.

① Lambda expression

- 람다 표현식은 curly braces로 둘러싸여있어야 한다.

- -> 오른쪽이 함수 본문이다.

- 람다 body의 마지막 expression은 암묵적으로 return 값이 된다.

- kotlin에서 람다는 first-class다. (java에선 x)

- 람다를 function parameter로 사용할 땐 맨 뒤에 쓰는 것이 추천되는데, 결국 아예 밖으로 빼서 trailing lambda형태로 쓰기 위함이다.

귀에 못이 박히도록 들어본 람다 표현식은, 함수 리터럴의 표현법인 것!!

 

② Anonymous function

참고로 함수를 선언할 때에는 function name이 필수적이지만,

함수 리터럴은 function name이 필수적이지 않기 때문에 ②와 같이 익명 함수가 존재할 수 있다.

또한 두 경우 모두 함수가 myfirstFunc이라는 변수에 저장되는 것을 확인할 수 있다:-)