{ 매개변수 -> 함수 본문 }
-> 기준 왼쪽은 매개변수, 오른쪽은 함수 본문을 나타냄
함수의 반환값은 본문의 마지막 표현식
val sum = {no1: Int, no2: Int -> no1 + no2}
{no1: Int, no2: Int -> no1 + no2} (10, 20)
선언과 호출을 동시에 할 수 있음
{-> println("...")}
{println("...")}
화살표를 생략 할 수 있음
val some1 = {no: Int -> println(no)}
val some2 = (Int) -> Unit = {println(it)}
매개변수가 1개일 때는 중괄호 안에서 매개변수 선언을 생략하고 it 키워드를 사용 할 수 있음
fun main() {
val some = {no1: Int, no2: Int ->
println("...")
no1 * no2
}
}
람다 함수의 반환값은 함수 본문 마지막 줄의 실행 결과
val some: (Int, Int) -> Int = { no1: Int, no2: Int -> no1 + no2 }
/* 함수 타입 */ /* 함수 내용 */
typealias MyInt = Int
fun main() {
val data1: Int = 10
val data2: MyInt = 10
}
typealias를 이용해 정수를 표현하는 새로운 별칭 선언 가능
typealias MyFunType = (Int, Int) -> Boolean
fun main() {
val someFun: MyFunType = {
no1: Int, no2: Int -> no1 > no2
}
}
위와 같이 함수 타입도 별칭으로 선언하여 사용 가능
typealias MyFunType = (Int, Int) -> Boolean
val someFun: MyFunType = {
no1, no2 -> no1 > no2
}
매개변수의 타입을 유추할 수 있을 경우 선언 생략 가능
val someFun = {
no1: Int, no2:Int -> no1 > no2
}
위와 같이 함수의 타입도 유추할 수 있으면 생략 가능
fun hofFun(arg: (Int) -> Boolean): () -> String {
val result = if(arg(10)) {
"valid"
} else {
"invalid"
}
return (result)
}
fun main() {
val result = hotFun({no -> no > 0})
}
위와 같이 함수를 매개변수로 전달해서 사용 가능
val data: String = "hello"
val data2: String? = null
data2 변수는 null이기 때문에 아직 주솟값을 가지지 못함
널인 상태의 객체를 이용하게 되면 널 포인트 예외가 발생
fun main() {
var data: String? = null
val length = if (data == null) {
0
} else {
data.length
}
}
이처럼 널 포인트 예외가 발생하지 않게 작성했지만, 좀 더 효율적인 방법이 필요함
fun main() {
var data: String? = null
{data?.length ?: 0} // 0
}
위와 같이 널 안전성 연산자를 이용해서 예외가 발생하지 않게 작성할 수 있음
var data: String? = "gildong"
var data: String? = "gildong"
var length = data?.length
만약 data 변수가 null이 아니면 멤버에 접근하고, null이면 멤버에 접근하지 않고 null을 반환
var data: String? = "gildong"
{data?.length ?: -1}
엘비스 연산자는 변수가 null이면 null을 반환
fun some(data: String?): Int {
return data!!.length
}
매개변수로 null이 전달되면 예외 메세지가 반환됨
Do it! 깡쌤의 안드로이드 프로그래밍 with 코틀린 (개정판)