1급 시민(first-class citizen)이란?
프로그래밍에서 1급 시민이란 다음의 조건을 충족하는 것을 말한다.
- 변수에 담을 수 있다.
- 함수의 인자로 전달할 수 있다.
- 함수의 반환값으로 전달할 수 있다.
1급 객체와 1급 함수?
1급 시민, 1급 객체, 1급 함수와 같이 비슷한 용어들이 존재하는데 그 미묘한 차이를 정리해보자.
1급 객체
는 말 그대로 1급 시민의 조건을 충족하는 객체를 이야기한다. 코틀린의 함수는 객체로 사용할 수 있기 때문에 1급 객체에 속한다.
1급 함수
는 1급 객체이면서 아래의 조건들은 추가로 만족하는 함수를 말한다.
- 런타임에 생성이 가능하다.
- 익명으로 생성이 가능하다.
코틀린과 1급 함수
코틀린의 함수는 1급(first-class)이다. 자바의 경우 함수는 클래스의 멤버의 역할만을 수행했지만, 코틀린에서는 함수 자체가 하나의 변수가 될 수 있다. 즉, 변수에 할당할 수 있으며 다른 고차 함수의 인자로 전달되고 반환될 수 있다.
// 1. 변수나 데이터 구조에 할당
val function = { println("first-class test") }
// 2. 함수의 인자로 전달
fun function2(f: () -> Unit) {
f.invoke()
}
// 3. 함수의 반환값으로 전달
fun function3() : () -> Unit {
return function
}
fun main() {
val a = function
a.invoke()
function2(a)
function3().invoke()
}
데이터 구조에 할당하는 예시는 다음과 같다.
fun add(a: Int, b: Int) = a + b
fun subtract(a: Int, b: Int) = a - b
val functions = mutableListOf(::add, ::subtract) // MutableList에 함수 할당
fun main() {
println("add : ${functions[0](10, 2)}, sub : ${functions[1](15, 5)}")
// add : 12, sub : 10
}
References
'Kotlin' 카테고리의 다른 글
[Kotlin] Scope function (let, run, with, apply, also) 정리 (0) | 2022.03.02 |
---|---|
메서드 체이닝 패턴이 적용된 코틀린 코드의 시간 복잡도 구하기 (0) | 2022.02.05 |
[Kotlin] 최상위 함수와 프로퍼티 (0) | 2021.12.29 |
[Kotlin] 코틀린과 함수형 프로그래밍 (0) | 2021.12.27 |
[Kotlin] 정적 타입 언어 vs 동적 타입 언어 (0) | 2021.12.25 |