728x90
코틀린 함수의 기본형태
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)
}
 


728x90

'안드로이드 > Kotlin 문법' 카테고리의 다른 글

코틀린 object  (0) 2020.01.19
코틀린 data class (자바의 getter 와 setter 클래스)  (0) 2020.01.16
코틀린 접근 제한자  (0) 2020.01.14
코틀린 패키지  (0) 2020.01.13
코틀린 인터페이스  (0) 2020.01.13
블로그 이미지

Link2Me

,