Daily Kotlin - 람다식, 일급객체, 고차함수, 함수, Unit, default 매개변수, vararg

2 minute read

  • 람다식 : 다른 함수의 인자로 넘기는 함수, 함수의 결괏값으로 반환하는 함수, 변수에 저장하는 함수

  • 일급 객체 : 함수의 인자로 전달할 수 있고, 함수의 반환값에 사용될 수 있고, 변수에 담을 수 있는 객체

  • 고차 함수 : 다른 함수를 인자로 사용하거나 함수를 결괏값으로 반환하는 함수

  • 함수형 프로그래밍의 특징 : 순수 함수 이용, 람다식 사용, 고차함수 사용

  • 함수 작성법

package chap03.section1

fun sum(a: Int, b: Int): Int {
    var sum = a + b
    return sum
}

fun sum2(a: Int, b: Int): Int {
    return a + b
}

fun sum3(a: Int, b: Int): Int = a + b

fun sum4(a: Int, b: Int) = a + b

fun main() {
    val res1 = sum(3, 2)
    val res2 = sum2(6, 7)

    println(res1)
    println(res2)
}
  • Unit 자료형 : 반환값이 없을 때 사용
fun printSum(a: Int, b: Int): Unit {
    println("sum of ${a} and ${b} is ${a+b}")
}
  • default 매개변수
package chap03.section1

fun main() {
    val name = "고려대"
    val email = "webmaster@korea.ac.kr"

    add(name)
    add(name, email)
    add("연세대", "chicken@yonsei.ac.kr")
    defaultArgs()
    defaultArgs(300)
}

fun add(name: String, email: String = "default") {
    val output = "${name}님의 이메일은 ${email} 입니다."
    println(output)
}

fun defaultArgs(x: Int = 100, y: Int = 200) {
    println(x+y);
}
고려대님의 이메일은 default 입니다.
고려대님의 이메일은 webmaster@korea.ac.kr 입니다.
연세대님의 이메일은 chicken@yonsei.ac.kr 입니다.
300
500
  • vararg : 다양한 인자의 개수를 전달받는 함수
package chap03.section1

fun main() {
    normalVarargs(1, 2, 3, 4)
    normalVarargs(4, 5, 6)
}

fun normalVarargs(vararg counts: Int) {
    for (num in counts) {
        print("$num ")
    }
    print("\n")
}
1 2 3 4 
4 5 6
  • 변수에 람다식 함수 작성
package chap03.section3

fun main() {
    var result: Int
    var multi = {x: Int, y: Int -> x * y}
    result = multi(10, 20)
    println(result)
}
200
  • 매개변수에 람다식 함수를 이용한 고차함수
package chap03.section3

fun main() {
    var res: Int
    res = highOrder({x, y -> x + y}, 10, 20)
    println(res)
}

fun highOrder(sum: (Int, Int) -> Int, a: Int, b: Int): Int {
    return sum(a, b)
}
30
  • 인자와 반환값이 없는 람다식 함수
package chap03.section3

fun main() {
    val out: () -> Unit = {println("Hello Kotlin")}
    out()
    val new = out
    new()
}
  • Call By Value로 람다식 사용
package chap03.section3

fun main() {
    val result = callByValue(lambda())
    println(result)
}

fun callByValue(b: Boolean): Boolean {
    println("callByValue function")
    return b
}

val lambda: () -> Boolean  = {
    println("lambda function")
    true
}
lambda function
callByValue function
true
  • Call By Name으로 람다식 호출
package chap03.section3

fun main() {
    val res = callByName(otherLambda)
    println(res)
}

fun callByName(b: () -> Boolean): Boolean { //람다식 자료형 매개변수
    println("callByName function")
    return b()
}

val otherLambda: () -> Boolean = {
    println("otherLambda function")
    true
}
callByName function
otherLambda function
true
  • Call By Reference로 일반 함수 호출
package chap03.section3

fun main() {
    val res1 = funcParam(3, 2, ::sum)
    println(res1)

    hello(::text)

    val likeLambda = ::sum
    println(likeLambda(6, 6))
}

fun sum(a: Int, b: Int) = a + b

fun text(a: String, b: String) = "Hi! $a, $b"

fun funcParam(a: Int, b: Int, c: (Int, Int) -> Int): Int {
    return c(a, b)
}

fun hello(body: (String, String) -> String): Unit {
    println(body("Hello", "Kotlin"))
}
5
Hi! Hello, Kotlin
12
  • 다중 매개변수 람다식

람다식 매개변수가 1개인 경우, {a -> "Something $a"}{"Something $it} 과 같다.

package chap03.section3

fun main() {
    twoLambda({a, b -> "First $a $b"}, {"Second $it"})
}

fun twoLambda(first: (String, String) -> String, second: (String) -> String) {
    println(first("OneParam", "TwoParam"))
    println(second("OneParam"))
}
First OneParam TwoParam
Second OneParam

Categories:

Updated:

Comments