개발자의 생활

고차함수, 람다함수 본문

kotlin(코틀린) 강좌

고차함수, 람다함수

Developer성현 2024. 10. 24. 13:19

고차함수는 함수를 변수처럼 다른함수에 인자로 넘기거나 반환할 수 있는 타입의 함수입니다. 그리고

람다함수는 함수를 간결하고 익명함수로 이름을 정의하지 않고 간단한 로직을 작성할 때 사용하는 함수입니다.

 

이 함수들을 이용하면 간결하고 유연한 코드작성이 가능해집니다.

 

예시와 함께 사용방법을 알아보겠습니다.

 

고차함수

fun main() {
    higherFun(::testFun)
}

fun testFun(str: String){
    println("이 함수는 $str")
}

fun higherFun(a: (String) -> Unit){
    a("고차함수 입니다.")
}

 

메인 함수를 제외하고 함수 2개가 있습니다. 위에 두 함수 모두 일반적인 함수의 형태이지만 higherFun 함수의 매개변수 타입은 일반적이지 않습니다. (String) -> Unit 이것은 함수형태의 데이터 타입입니다.

([매개변수 타입]) -> [반환 타입] 위 코트에는 매개변수 타입이 String 이고 반환타입이 Unit 입니다. Unit는 반환값이 없을때 사용하는 키워드 입니다. 위와 동일한 타입의 함수를 testFun 이름으로 정의를 하였습니다.

즉 testFun 함수를 인자값으로 넘겨줄 수가 있습니다.

main함수에서 higherFun 의 매개변수로 testFun 함수를 넘겨주고 있는데요 일반함수를 넘겨주기 위해서는 고차함수 형태로 넘겨주어야 하기 때문에 :: 참조 연산자를 이용해 고차함수 형태바꿔서 넣어주어야 합니다.

 

그럼 좀더 나아가서 반환타입을 가지는 고차함수를 보겠습니다.

fun main() {
    higherFun(::testFun)
}

fun testFun(str: String): Int{
    println("이 함수는 $str")
    return 10
}

fun higherFun(a: (String) -> Int){
    println("반환값: " + a("고차함수 입니다."))
}

조금전의 코드에서는 반환값이 없었기 때문에 Unit 이라는 키워드를 사용했지만 이번에는 Int타입의 정수 10을 반환시켜 보겠습니다.

testFun 함수를 반환타입으로 수정하고 Unit 가 있는 자리에 그대로 반환타입을 적어주시면 됩니다.

 

람다함수

람다함수는 이름이 없는 익명함수 입니다.  일반적인 함수는 이름이 존재하고 그 이름을 통해 호출하기도 하여 사용하였지만 람다함수는 이름을 가지지 않고 변수타입처럼 사용이 됩니다.

fun main() {
    val a: (String, Int) -> String = {str: String, i: Int ->
        var strCount = ""

        for(count in 0..< i){
            strCount += count.toString() + str + "\n"
        }

        strCount
    }

    println(a("text", 3))
}

위 코드는 람다함수를 정의하고 a 라는 변수에 넣은것입니다.

가장 먼저 함수타입은 String와 Int를 매개변수로 두고 반환타입을 String 로 정의하였습니다. 그리고 이 타입을 가지는 a변수에 람다함수를 넣고 있는 형태인데요 중괄호 시작하고 -> 가 나오기 전까지가 파라미터로 받을 데이터 타입입니다.

일반 함수로 보면 fun [이름없음](str: String, i: Int) 이것과 동일한것입니다.

그리고 -> 다음부분이 함수 내용입니다. 일반적인 함수와 동일하게 작성하시면 됩니다. 다만 한가지 다른점은 return 값이 있는 함수인 경우에 마지막에 오는 값이 리턴값이 되는것입니다. 저 코드에서는 strCount 를 리턴하고 있습니다.

 

사실 이 코드에서도 (String, Int) -> String 가 없어도 타입추론을 해서 동작을 할 수 있습니다.

또한 (String, Int) -> String 가 있다면 여기서 매개변수 타입을 정의하고 있기 때문에 str: String, i: Int -> 에서 타입을 생략해도 됩니다.

 

fun main() {
    val a: (String, Int) -> String = {str: String, i: Int ->
        var strCount = ""

        for(count in 0..< i){
            strCount += count.toString() + str + "\n"
        }

        strCount
    }

    higherFun(a)
}

fun higherFun(hFun: (String, Int) -> String){
    println(hFun("고차함수", 5))
}

고차함수에 파라미터로 람다함수를 넣어도 동일하게 동작을 할 수 있습니다.

 

오늘도 끝까지 봐주셔서 감사합니다.

'kotlin(코틀린) 강좌' 카테고리의 다른 글

유용한 String 함수  (0) 2024.10.30
제네릭  (0) 2024.10.30
업, 다운 캐스팅 (다형성)  (0) 2024.10.22
스코프, 접근제한자 + 프로젝트 구조  (0) 2024.10.04
class 사용  (4) 2024.09.16