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이라는 변수에 저장되는 것을 확인할 수 있다:-)
'kotlin, java, android' 카테고리의 다른 글
[Kotlin] varargs(variable arguments) (0) | 2023.03.18 |
---|---|
[Kotlin] function expression / function parameter / single-expression function (0) | 2023.03.18 |
[kotlin] Lists and arrays / Null safety (0) | 2023.03.12 |
[kotlin] primitives와 objects / datatypes / variables / ranges / loop (0) | 2023.03.11 |
[Kotlin] 기본 문법 정리 (0) | 2023.03.05 |