๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฑ/๐Ÿ“—Kotlin

[Kotlin] ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๐Ÿ’ก์ต๋ช…ํ•จ์ˆ˜, ์ธ๋ผ์ธ ํ•จ์ˆ˜, ํ™•์žฅํ•จ์ˆ˜, Infix ํ•จ์ˆ˜, ๊ณ ์ฐจํ•จ์ˆ˜๐Ÿ’ก

 


โ–ช๏ธํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

· Java๋Š” ์™„๋ฒฝํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค.

· Kotlin์€ ํ•จ์ˆ˜๋งŒ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•œ๋‹ค.

· ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋Š” ํ•œ ์ค„๋กœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

fun main() {
    val result1 = fun1(100, 200)
    println(result1)

    val result2 = fun2(200, 300)
    println(result2)

    val result3 = fun2(300, 400)
    println(result3)
}

fun fun1(num1 : Int, num2 : Int) : Int {
    return num1 + num2
}

// fun1์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋Š” ํ•œ ์ค„๋กœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅ
fun fun2(num1 : Int, num2 : Int) : Int = num1 + num2

// ์ž๋™์œผ๋กœ ํƒ€์ž…์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ˜ํ™˜ ํƒ€์ž… ์ƒ๋žต ๊ฐ€๋Šฅ
fun fun3(num1 : Int, num2 : Int) = num1 + num2

 

๋žŒ๋‹ค์‹

· ์œ„์—์„œ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋Š” ๋žŒ๋‹ค๋ผ๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๊ฟ” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

· ํŠน์ • ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

fun main() {
    val lambda1 : (Int, Int) -> Int = { num1 : Int, num2 : Int -> num1 + num2 }
    val result1 = lambda1(100, 200)
    println(result1)

    // ๋žŒ๋‹ค ๋˜ํ•œ ํƒ€์ž… ์ƒ๋žต์ด ๊ฐ€๋Šฅ
    val lambda2 = { num1 : Int, num2 : Int -> num1 + num2 }
    val result2 = lambda2(200, 300)
    println(result2)

    // ์•ž์˜ ํƒ€์ž…์„ ๋ณด๊ณ  ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด„ํ˜ธ์•ˆ์˜ ํƒ€์ž… ์ƒ๋žต ๊ฐ€๋Šฅ
    val lambda3 : (Int, Int) -> Int = { num1, num2 -> num1 + num2 }
    val result3 = lambda2(300, 400)
    println(result3)

    val lambda4 = { num1 : Int, num2 : Int ->
        val result1 = num1 + num2
        val result2 = num1 - num2

        // ๋žŒ๋‹ค์‹์—์„  ๋งˆ์ง€๋ง‰์ด return๊ฐ’
        result1 * result2
    }
    val result4 = lambda4(400, 500)
    println(result4)
}

 

 

โ–ช๏ธ์ต๋ช…ํ•จ์ˆ˜

· ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด ์—†๋Š” ํ•จ์ˆ˜์ด๋‹ค.

· ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด์•„ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

fun main() {
    val NonFunction = fun() {
        println("NonFunction ํ˜ธ์ถœ")
    }

    NonFunction()
}

 

 

โ–ช๏ธ์ธ๋ผ์ธ ํ•จ์ˆ˜

· ์ „์ฒด ์ฝ”๋“œ ์–‘์ด ๋Š˜์–ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

· ์ฝ”๋“œ ํ๋ฆ„์˜ ์ด๋™ ์—†์ด ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…๋Ÿ‰์ด ๋Š˜์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

fun main() {
    inlFunction1()
    inlFunction1()
    
    // inlFunction2() ํ•จ์ˆ˜๋‚ด์˜ ์ฝ”๋“œ๊ฐ€ ๋ณต์‚ฌ๋˜์–ด ๋ฎ์–ด์”Œ์›Œ์ง
    inlFunction2()
    inlFunction2()
    
    /*
    ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ”๋€œ
    
    println("----------")
    println("inlFunction2 ํ˜ธ์ถœ")
    println("----------")
    println("----------")
    println("inlFunction2 ํ˜ธ์ถœ")
    println("----------")
    */
}

fun inlFunction1() {
    println("----------")
    println("inlFunction1 ํ˜ธ์ถœ")
    println("----------")
}

inline fun inlFunction2() {
    println("----------")
    println("inlFunction2 ํ˜ธ์ถœ")
    println("----------")
}

 

 

โ–ช๏ธํ™•์žฅํ•จ์ˆ˜

· ๊ธฐ์กด ํด๋ž˜์Šค์— ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

· ๊ธฐ์กด ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‚ฌ์‹ค ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ›์€ ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

fun main() {
    var str = "abcd"
    println(str.extFunction())
}

// ๊ธฐ์กด String ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ
// ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ƒฅ ์ผ๋ฐ˜์ ์ธ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๊ณ  ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์Œ
fun String.extFunction() : String {
    return this.toUpperCase()
}

 

 

โ–ช๏ธInfix ํ•จ์ˆ˜

· ํ•จ์ˆ˜๋ฅผ ์—ฐ์‚ฐ์ž์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

fun main() {
    val result1 = 100 add2 100
    println("result1 : $result1")

    val result2 = 100 minus2 100
    println("result2 : $result2")
}

infix fun Int.add2(num : Int) : Int {
    return this + num
}

infix fun Int.minus2(num : Int) : Int {
    return this - num
}

 

 

โ–ช๏ธ๊ณ ์ฐจํ•จ์ˆ˜

· ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ํ•จ์ˆ˜์ธ ํ•จ์ˆ˜๋ฅผ ๊ณ ์ฐจํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

· ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜์™€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

fun main() {
    // ์ต๋ช…ํ•จ์ˆ˜ ์‚ฌ์šฉ
    val fun1 = fun(n1 : Int, n2 : Int) : Int {
        return n1 + n2
    }
    higFunction1(fun1, 100, 200)

    // ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ๋„ฃ์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    higFunction1(fun(n1 : Int, n2 : Int) : Int {
        return n1 - n2
    }, 100, 200)

    // ๋žŒ๋‹ค ์‚ฌ์šฉ
    val lambda1 = { n1 : Int, n2 : Int -> n1 * n2 }
    higFunction1(lambda1, 100, 200)

    // ๋žŒ๋‹ค๋ฅผ ๋ฐ”๋กœ ๋„ฃ์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    higFunction1({n1 : Int, n2 : Int -> n1 / n2}, 200, 100)

    ///////////////////////////////////////////////////

    val fun2 = higFunction2()
    val result2 = fun2(100, 200)
    println("result2 : $result2")

    val fun3 = higFunction3()
    val result3 = fun3(100, 200)
    println("result3 : $result3")
}

// ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ•จ์ˆ˜์ธ ๊ณ ์ฐจํ•จ์ˆ˜
fun higFunction1(f:(Int, Int) -> Int, num1 : Int, num2 : Int) {
    val result1 = f(num1, num2)
    println("result1 : $result1")
}

// ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ํ•จ์ˆ˜์ธ ๊ณ ์ฐจํ•จ์ˆ˜
fun higFunction2() : (Int, Int) -> Int {
    return fun(n1 : Int, n2 : Int) : Int {
        return n1 + n2
    }
}

// ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋žŒ๋‹ค์ธ ๊ณ ์ฐจํ•จ์ˆ˜
fun higFunction3() : (Int, Int) -> Int {
    return { n1 : Int, n2 : Int -> n1 - n2 }
}