관리 메뉴

0101011001010111

Kotlin 강좌 #14 - 고차함수와 람다함수 // 네이버블로그 이후 이어서 작성 본문

Kotlin/Dimo

Kotlin 강좌 #14 - 고차함수와 람다함수 // 네이버블로그 이후 이어서 작성

[진주] 2023. 8. 1. 16:27
728x90
반응형

고차함수에 대해서 이해해보려고 노력중이었다.

 

fun main() {
    b(::a)
}

fun a (str:String){
    println("$str 함수 a")
}

fun b (function: (String)->Unit){
    function("b가 호출한")
}

자, 다음과 같은 코드에서 나는 아래와 같이 정리하였다.


힌트 1

: 은, 넘겨받는것

 

힌트 2

:: 은 일반함수를 고차함수로 변경해주는 연산자

 

힌트3

고차함수란, 함수를 마치 클래스에서 만들어낸 '인스턴스'처럼 취급.

함수를 '패러미터'처럼 넘겨줄 수도 있고, '결과값으로 반환' 받을 수 도 있는 방법

 

힌트 4

함수의 형식을 자료형으로 나타내는 법은, 

위와 같다.

 

힌트 5

main()

b(::a)

자, main()함수가 a함수를 b함수에 패러미터로 넘겼고,

 

 

b()

function = a                     <<b함수는 받아온 a함수에 

function("b가 호출한")    <<"b가 호출한" 이라는 값을 넘겨서 호출하였습니다.

 

b함수는 받아온 a함수에 "b가 호출한" 이라는 값을 넘겨서 호출하였습니다.

 

 

 

a()

str = "b가 호출한"

println("$str 함수a")

 

보시면 최종적으로 a라는 함수가 실행되면서,

"b가 호출한 함수a"라는 문자열이 출력되는 것을 확인하실 수 있습니다.

 


ㅇ...오케이 이해한걸까?

 

자 그림이 개떡같은가 ?

나의 마음이다.

대충 이렇게 실행하는 듯 하다.

일단 8월 35도의 날씨에 컴퓨터가 돌아가는 방구석에서 거의 체감온도 50도를 넘는데

녹는 뇌를 부여잡으면 서 4시간 동안 낑낑댔다.

 

그래 다른 예제들을 나중에 보면 더 이해하게 되겠지.

 

가끔은 대충 이해하고 넘어가는 것도 ^ㅁ^....(ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ으어큐ㅠㅠㅠ)

일단 꼭 다음에 다시 이해하도록 해보자!!!!

 


 

그런데, 패러미터로 넘길 함수를 굳이 이름까지 따로 만들 필요가 있을까요?

ㄴ 이때는 함수를 람다식으로 표현하는 람다함수lambda function 라는 것을 사용하는데요.

 

방금 만든 함수 a와 같은 형태를 람다 함수로 만들어 보죠 (ㅠㅠㅠㅠㅠㅠ아니 그러지마)

fun a (str:String){
    println("$str  함수 a")
}

▲ 이전 만든 a함수

 

람다함수는, 일반함수와 달리 그 자체가 고차함수이기 때문에 별도의 연산자 없이도 변수에 담을 수 있습니다.

(우리 아까 a 넣어줄때 고차함수로 쓰려고 :: 연산자를 썼어)

임시로 사용할 변수 c를 만들어봅시다.

그리고 콜론 뒤에 아까 배웠던 함수의 형식을 써보죠.

일반적인 형식에 자료형을 쓰듯 

그자리에 함수의 형식을 쓴 것입니다.

 

▽이제 , 실제 동작할 람다 식 부분을 구현 할 텐데요.

뒤에 함수쓰는것처럼 중괄호도 써준다.
패러미터로 받아온 문자열을 매칭해 줄 변수 이름을 써줍니다.

▲이때, 콜론형을 쓰고 자료형을 쓰는게 기본 형태이지만

val c: (String) -> Unit = {str : String}          //이렇게 말이다.

▲이미 이렇게 패러미터에 자료형이 기술되어 있어, 

코틀린은 이걸 보고 생각하지 : ' 앞에 String 이라고 써있으니 str놈도 String 이겠꼬만!!! '

(코틀린은 조금 똑똑한 녀석인듯하다)

▲이제 이 패러미터로 동작시킬 구문을 기술할 차례인데요, 

 

함수의 형식에서와 같이 화살표 형태를 써준 후, 패러미터로 받아온 문자열 뒤에 '람다함수'라고 출력해 줍니다.

이제 함수 b에 람다함수 c를 넘겨 실행해 보면,

결과값

아까 실행했던 것과 동일한 구조로 "b가 호출한 람다함수" 라는 문자열이 출력되는 것을 보실 수 있습니다.

(이해안돼 ㅠㅠ 흑흑)

축약전과 아래의 축약후를 비교해보자.
람다함수 축약해서 기술할 수 있다.

람다 함수역시 변수에 할당 할때는 이전에 배웠던 타입추론 기능을 이용하여 좀 더 축약해서 기술 할 수 있는데요.

함수의 형식을 적지 않고

바로 중괄호안에 직접 패러미터의 자료형만 써주시면

코틀린은 생각한다 : ' 아 얘는, String을 하나 받지만 반환값은 없다는 거군.'

패러미터와 리턴값을 자동으로 추론하여 이에 맞는 함수형식의 객체로 변수에 저장해 줍니다.


 

정리 : 고차함수와 람다함수를 사용하면 이렇게 함수를 일종의 변수로 사용할수 있다는 편의성도 있지만 이후, 배우게 될 컬렉션의 조작이나 스코프 함수의 사용에도 도움이 됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형