[kotlin] 함수에 대하여

나호영·2023년 3월 25일

코틀린의 중요한 개념 중 하나는 모든 것을 값을 가진다는 것이다. 아래와 같은 if문도 표현식으로 작성되어 값으로 표현된다. 함수도 마찬가지이다.

val a = if(temp<40) true else false

function may have

  • Default parameter
    디폴트 값이 존재하는 파라미터. 원칙 상 마지막에 와야 하지만 Named argument로 readability 있게 작성하면 다른 곳에 있어도 상관없음.(권장하지 않음)
  • Required parameter
    일반적인 파라미터.
  • Named argument
    argument를 파라미터로 보낼 때, 파라미터 이름을 따로 명시해주어 readability를 좋게 만든다.(권장)

vararg

함수는 여러 인자들을 받을 수 있다.

fun <T> varargExample(vararg ts: T) { ... }
fun main(args: Array<String>) {
	val a = arrayOf(1,2,3)
    varargExample(*a) // spread operator
}

= symbol

만약 함수의 리턴 값이 하나의 표현식을 리턴할 때는 중괄호가 아니라 =를 사용할 수 있다.

fun function() {
	return expression
}
fun function() = expression

function literal

앞서 함수도 값으로 표현될 수 있다고 하였다. 즉, 변수처럼 인자로 전달될 수도 있고 변수에 저장될 수도 있다. 이렇게 값으로 사용되는 함수를 함수 리터럴이라고 한다. 함수 리터럴은 다음과 같은 두가지 방식으로 표현가능하다.

  • Lambad Expression(람다표현식)
  • Anonymous function(익명함수)

예시는 각각 아래와 같다.

람다표현식
val a : {Int, Int) -> Int = {x, y -> x+y}
val a = {a: Int, b:Int -> a+b} // simplified
익명함수
val a = fun(a:Int, b:Int) : Int = a+b
a(2,3) or a.invoke(2,3)

람다표현식에서..

  • it?
    하나의 파라미터를 가지고 있을 때 사용 가능
{a -> a > 0} == {it > 0}
  • 람다표현식에서 마지막 표현식이 암시적으로 리턴값으로 취급된다.
  • trailing lambda : 코틀린에서 함수 파라미터를 받는 함수(higher-order function)은 마지막에 함수 파라미터를 받는 것을 선호한다. 이 때 다음과 같이 쓸 수 있다.
toUpperCase("abc", {it.uppercase()})
 -> toUpperCase("abc") {it.uppercase()}

익명함수에서..

  • 리턴 타입을 명확하게 명시하고 싶을 때 사용

람다표현식 vs 익명함수 as function literals

람다표현식에서 return은 non-local return이고 익명함수에서의 return은 local return이다. -> [lambda vs anonymous function]

:: operator

named function을 인자로 전달할 때 명확하게 이 것이 함수라는 것을 알리는 역할을 하며 이 함수를 호출하지 않게 함.

function with receiver

수신 객체 지정 함수 -> 특정한 객체를 대상으로 사용할 수 있는 함수
type like this

Int.(Int) -> String
익명함수
val sum = fun Int.(it: Int):Int = this + it

람다표현식
val sum : Int.(Int) -> Int = {plus(it)}
val sum : Int.(Int) -> Int = {this.plus(it)}
val sum : Int.(Int) -> Int = {this + it}

Higher-order function

함수를 파라미터로 받는 함수

example..
fun higherOrderFunction(func: (Int) -> Int) {...}
fun higherOrderFunction(arg: Int, func: (String) -> Int) {...}
fun higherOrderFunction(func: (Int, Int) -> Int) {...}

most kotlin built-in function are defined using last parameter call syntax. somthing like..

inline fun repeat(times: Int, action: () -> Unit)
repeat(3) {
 println("hello")
 }
profile
공부 내용 기록

0개의 댓글