코틀린 리서치 - Functions and Lambda[5]
코틀린의 패키지, 함수 표현법, Lambda 표현식에 대해 알아보겠습니다.
Top-Level Functions
코틀린에서 모든것은 패키지의 일부입니다.
package name 형식으로 감싸진 모듈은 다른 파일에서 import하여 사용 할 수 있습니다.
//func.kt
package ExampleModule.Hello
fun HelloModule()
{
println("called!")
}
//main.kt
package ExampleModule.Hello.*
fun HelloModule()
{
println("called!")
}
Return Type and Arguments
코틀린의 함수는 다음과 같은 형식으로 반환 형식과 input paramter를 지정 할 수 있습니다.
fun main(args: Array<String>) {
square(10)
println(square(10))
println(triple(3))
}
fun square(x:Int = 5) : Int
{
return x * x
}
fun triple(x:Int) = x*3 // 이런 방식도 가능하다.
Local (a.k.a Inner) Functions
함수 안에 함수를 선언하여 사용 할 수 있습니다.
fun solve_quadratic_equation(a:Double, b:Double, c:Double) : Pair<Double, Double>
{
fun calc_discriminant(a:Double, b:Double, c:Double = 5.0): Double
// fun calc_discriminant(): Double // 인자를 생략해도 내부적으로 캡쳐되어 사용 가능
{
return b*b-4*a*c
}
var root_disc = Math.sqrt(calc_discriminant(a,b,c))
return Pair((-b+root_disc)/(2*a),(-b-root_disc)/(2*a))
}
Infix Functions
코틀린에서 infix Function이라 불리는 특정 함수들은 다음과 같은 방법으로 사용이 가능합니다.
fun InfixFunctionExample()
{
val alphabat = 'z' downTo 'a' // downTo is Infix Function
}
downTo 함수의 구현부를 살펴보면 infix 키워드로 구현 되어있음을 알 수 있습니다.
public infix fun Char.downTo(to: Char): CharProgression {
return CharProgression.fromClosedRange(this, to, -1)
}
이러한 방식으로 개발자도 custom infix 함수를 작성 할 수 있습니다.
Lambda Functions
코틀린의 람다 함수는 다른 언어의 람다 표현식과 같은 개념이며 { 파라메터 -> 계산식 }
으로 표현합니다.
fun LambdaExample()
{
var product:(int, int) -> Int = {x, y -> x*y}
var result = product(2, 3)
println(result)
}
Extension method
코틀린에서는 기존에 존재하는 객체에 사용자가 특정 함수를 포함시킬 수 있습니다.
fun <T> ArrayList<T>.swap(index1:Int, index2:Int)
{
val temp = this[index1]
this[index1] = this[index2]
this[index2] = temp
}
fun ExtensionFuncExample()
{
var MyIntFunc = fun Int.(value:Int) = this + value
var x = 1
print(x.MyIntFunc(10)) // Int 객체에 MyIntFunc가 포함된 것처럼 사용 가능하다.
val myList = arrayListOf(1, 2, 3)
myList.swap(0, 2) // arrayList에 swap을 추가하여 사용 가능
}