728x90
반응형
1. 함수 리터럴과 람다식
코틀린에서는 함수 리터럴을 두 가지 형태로 만들 수 있다.
하나는 람다식이고 다른 방법은 익명 함수이다.
람다식은 {매개변수 -> 반환 값} 형태를 가지고 있다.
아래 예제 코드와 주석을 통해 추가 설명을 적겠다.
fun main() {
// 함수타입 : 매개변수가 Int 타입, 반환 타입 Unit인 함수를 저장할 수 있는 타입
val instantFunc: (Int) -> Unit
// 함수 리터럴 : 함수를 나타내는 리터럴
/* number: Int => 리터럴의 매개변수를 나타냄
-> 경계로 매개변수와 함수의 내용이 분리됨
매개변수가 없는 함수 리터럴을 만들고 싶다면, number: Int -> 부분 없이 함수 내용만 나오게
함수 리터럴에는 return을 적지 않는다. 리터럴의 반환 값은 함수 내용의 맨 마지막 표현식이 된다. */
instantFunc = { number: Int -> println("Hello $number") }
instantFunc(33)
// 함수 타입의 변수는 invoke 멤버 함수를 통해서도 호출 가능
/* 변수가 Nullable일 때는 invoke를 통해서 호출하는 편이 instantFunc?.invoke(33)과 같이
쓸 수 있으므로 Null 처리를 하기 편해진다. */
instantFunc.invoke(33)
}
함수 타입은 참조 타입이기 때문에 객체와 마찬가지로 스택 영역에 함수가 바로 저장되는 것이 아니라, 함수의 위치를 가리키는 형태로 저장된다.
2. 익명 함수
익명 함수는 함수 리터럴을 작성하는 또 다른 방법이며, 함수의 이름이 없는 일반 함수와 형태가 거의 동일하다.
inline 같은 키워드를 붙일 수 없다는 점에서 일반 함수와 차이가 있다.
익명 함수는 람다식보다 복잡하지만 return으로 반환 값을 직접 지정해 줄 수 있기 때문에 마지막 표현식이 자동으로 반환 값이 되어버리는 람다식보다 버그를 일으킬 확률이 적다.
fun main() {
val instantFunc: (Int) -> Unit = fun(number: Int): Unit {
println("Hello $number")
}
instantFunc(33)
instantFunc.invoke(33)
}
3. it 식별자
람다식의 매개변수가 하나일 때는 매개변수 선언을 생략할 수 있다.
Int 타입의 매개변수를 적어주어야 하지만 생략하였다. 매개변수를 생략하면 it 식별자가 만들어지게 되는데, 여기서 it이 생략한 Int 타입의 매개변수를 대체한다.
fun main() {
val instantFunc: (Int) -> Unit = {
println("Hello $it")
}
instantFunc(12)
}
728x90
반응형
'TIL > Kotlin' 카테고리의 다른 글
[TIL/Kotlin] 코틀린 고급문법_리시버가 붙은 함수리터럴, 제네릭(Generic), 여러 타입을 인수로 받기, 구체화된 타입 매개변수 (0) | 2023.05.26 |
---|---|
[TIL/Kotlin] 코틀린 고급문법_함수 참조, 고차 함수, 클로저(Closure) (0) | 2023.05.24 |
[TIL/Kotlin] 코틀린 고급문법_데이터 클래스와 객체 분해하기 (0) | 2023.05.21 |
[TIL/Kotlin] 코틀린 고급문법_중첩 클래스와 내부 클래스 (0) | 2023.05.21 |
[TIL/Kotlin] 코틀린 고급문법_추상 클래스, 인터페이스, 다이아몬드문제(상속구현문제) (0) | 2023.05.17 |