코틀린 함수의 기본형태
fun 함수명(매개변수):Unit {
}
fun 함수명(매개변수):리턴타입 {
return 값
}
고차함수
고차함수(High-order Function)란 다른 함수를 인자로 사용하거나, 함수를 결과값으로 반환하는 함수를 말한다.
package com.myapp.funcargs
fun main(){ val a = sum(4,5) // 일반 인자 println("a result : $a") val b = mul(sum(1,2), 3) // 인자에 함수 사용 println("b result : $b")
println("ResultFun : ${resultFun()}") }
fun sum(a: Int, b: Int) = a + b fun mul(a: Int, b: Int) = a * b fun resultFun(): Int { return mul(3,5) // 함수의 반환 값으로 함수 사용 }
|
람다 표현식
람다식, 또는 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수 (Anonymous Functions)를 지칭하는 용어이다.
val lambdaName: Type = {argument -> codeBody}
람다 함수는 { } 안에 매개변수와 함수 내용을 선언하는 함수로 다음 규칙에 따라 정의한다.
- 람다 함수는 항상 { }으로 감싸서 표현해야 한다.
- { } 안에 -> 표시가 있으며 -> 왼쪽은 매개변수, 오른쪽은 함수 내용이다.
- 매개변수 타입을 선언해야 하며, 추론할 수 있을 때는 생략할 수 있다.
- 함수의 반환값은 함수 내용의 마지막 표현식이다.
fun sum(a: Int, b: Int) = a + b
를 람다 함수로 정의하면
val sum ={a: Int, b: Int -> a + b}
또는
val sum: (Int, Int) -> Int ={a, b -> a + b}
package com.myapp.funcargs
fun main(){ val a = sum(4,5) // 일반 인자 println("a result : $a") val b = mul(sum(1,2), 3) // 인자에 함수 사용 println("b result : $b")
println("ResultFun : ${resultFun()}")
val c:(String)->Unit ={str -> println("$str 람다함수")} b(c) }
val sum ={a: Int, b: Int -> a + b} // val sum: (Int, Int) -> Int ={a, b -> a + b} // val mul ={a: Int, b: Int -> a * b} val mul: (Int, Int) -> Int ={a, b -> a * b} fun resultFun(): Int { return mul(3,5) // 함수의 반환 값으로 함수 사용 } fun b (function: (String)->Unit){ function("b가 호출한") }
|
확장함수(Extension Function)
Extension functions(확장 함수)는 기존에 정의된 클래스에 함수를 추가하는 기능이다.
자신이 만든 클래스는 새로운 함수가 필요할 때 쉽게 추가할 수 있다.
하지만 Standard Library 또는 다른 사람이 만든 라이브러리를 사용할 때 함수를 추가하기가 매우 어렵다.
확장 함수는 fun 클래스이름.함수이름(매개변수): 리턴타입 { 구현부 }으로 정의할 수 있다.
또는
fun 확장하려는대상.함수명(매개변수):Unit {
}
fun 확장하려는대상.함수명(매개변수):리턴타입 {
return 값
}
확장함수 예제1
class Car { fun getPrice() : Int { return 8000 } }
fun Car.getBrandName() : String { return "BMW" }
fun Car.getBrandName2() : Car { println("KIA") return this }
fun main(args: Array<String>) { val car = Car() println(car.getBrandName()) println(car.getBrandName2().getPrice()) } |
확장함수 예제2
fun String.getLonggerLength(x: Int) : Int { return if(this.length > x) this.length else x }
fun main(args: Array<String>) { println("Hello".getLonggerLength(3)) } |
fun main(args: Array<String>) { println("Hello".getLonggerStringLength("Have a nice day!")) }
fun String.getLonggerStringLength(x: String) : Int { return if(this.length > x.length) this.length else x.length }
|
확장함수 예제3
class Car { fun getPrice(): Int { return 10000 } }
fun Car.getPrice(): Int { return 20000 }
fun Car.getPrice(price: Int): Int { return 30000 }
fun main(args: Array<String>) { val car = Car() println(car.getPrice()) println(car.getPrice(0)) } |
확장함수 예제4
fun List<Int>.getHigherThan(num: Int): List<Int> { val result = arrayListOf<Int>() for (item in this) { if (item > num) { result.add(item) } } return result }
fun main() { val numbers: List<Int> = listOf(1, 2, 3, 4, 5, 6, 7) val filtered = numbers.getHigherThan(3).toString() System.out.println(filtered) } |