0101011001010111

Kotlin - 오늘하루 고차함수 / 람다함수를 쥐어 뜯어봐도 이해 안간다 무작정 다 찾아보자 . 본문

카테고리 없음

Kotlin - 오늘하루 고차함수 / 람다함수를 쥐어 뜯어봐도 이해 안간다 무작정 다 찾아보자 .

[진주] 2023. 8. 1. 22:02
728x90
반응형

일단 뭐니뭐니해도 직접 문제를 풀어보는게 좋지 않겠어?!

 

고차함수,람다함수 의 문제를 풀어보도록 하자.


// 다음의 고차 함수는 두 개의 Int 값을 받아서 연산한 후 그 결과를 반환합니다.
// 이 함수를 완성하세요.

fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

fun main() {
    val result = calculate(10, 5, /* 여기에 람다함수를 작성하세요. */)
    println(result)
}


흠.

영어시험 지문 보는 느낌이다.

눈에 하나도 안들어와 ㅡ ㅡ .

 

그래도 일단 저 문제를 이해해보려 노력해보자.

 

일단 고차함수를 다시 복기해보자.

 

고차함수란 , 함수를 마치 클래스에서 만들어낸 [인스턴스] 처럼 취급하는 방법

함수를 [패러미터]로 넘겨 줄 수도 있고 [ 결과값으로 반환 ] 받을수도 있는 방법입니다.

라고 배웠는데, 

 

다른 곳에서는 

고차함수는, 다른함수를 매개변수로 받거나 함수를 반환하는 함수를 의미합니다.

 

 

아니 난 진짜 공부하면서 어이가 없는게 분명 쉬운 단어로 말할 수 있거든? 근데 왜 모든 공부는 뭔가 있어보이려는 척 어려운단어로 말하는거야 진짜 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

(대강 ㅂㄷ거리는중)


자, 다른함수를 매개변수로 받는다는 의미는 뭔지 알아보자.

이해할 땐, 뭐니뭐니 해도 예제 아니겠어?


다음은 두 수를 더하는 함수 sum과 이 함수를 인자로 받아 동작하는 고차 함수 operate의 예제입니다:

 

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

fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

fun main() {
    val result = operate(5, 10, ::sum)
    println(result)  // 출력: 15
}


이해해 보기 ▽

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

ㄴ 이것은 일반 함수의 구조이다. 나도 이해할수 있어.

sum이라는 함수는  Int값의 a,b패러미터를 가지고 있지. 

그리고 :Int는 뒤에 중괄호에 오는게 Int로 반환한다는거지  ( 맞지?)

그 안의 메서드(행위)를 살펴보면

return 되는 값은 a+b 이지.

 

오케이 ! 다음줄!!!

 

fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

 

음. 이걸 보자 마자 나는 바로 쭈구리가 되었어..

(내가 어려워하는 부분 빨간색표시)


op: (Int, Int) -> Int

에 대한 설명 ▽

 

여기서 op는 함수를 가리키는 변수명 입니다.

그리고 (Int, Int) -> Int 는 함수의 타입을 나타내는 표현이다.

 

쫌더 자세히..ㅠ_ㅠ ▼

ㅁ (Int, Int)는 함수의 입력을 나타내는 부분. 즉, 이 함수가 두개의 Int 타입 매개변수를 받는다는 걸 의미함.

->  화살표는 반환하는 거라고 생각하면 되는데, 

-> Int는 그니까 Int를 반환한다는 거지. ( 함수의 출력을 나타내는 부분이지)

 

자, 합쳐보면 op: (Int, Int) -> Int는 

op는 두개의 Int를 매개변수로 받아 Int를 반환하는 함수 라고 우린 읽을 수 있어.

 

그리고 내가 이해가 안갓던 매개변수는 : 들어올 값 ? 

이렇게 생각하면 될거같아.

아마도...(자신없음)


자, 그럼 '다른 함수의 매개변수를 받는다' 라는 의미를 내가 찾고있었잖ㅇ? 

 

다시 돌아가서 코드를 살펴보면

 

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

fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

fun main() {
    val result = operate(5, 10, ::sum)
    println(result)  // 출력: 15
}

 


fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

 

이 두번째줄을 해석해보자면

 

fun operate // operate 함수는,

 

fun operate(a: Int, b: Int, op: (Int, Int) -> Int)

// a라는 값과 b라는 값을 받고있는데, 이 둘은 Int 일거고 , op라는 녀석도 있는데, 이녀석은 두개의 Int값을 받아 Int로 반환시키는 녀석이야.

 

fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {}

// 자 그래서 operate는 이렇게 3개의 Int값을 매개변수로 받는 친군데, {}안에 있는 녀석 역시,  :Int로 반환 받을거야

 

fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

이 중괄호 안에는 말이야, 어떤 행위(메서드)를 할거냐면 return ob(a, b)할거야

내가 써놓고도 뭔 개소린지 모르겟다. 

return op(a,b)라니 

숫자를 차례로 나열하는거야 ? 왜 ? 

 

설명 ▼

return op(a,b) 코드는 'op'함수를 호출하고 그 결과를 반환하는 코드 입니다. 

ㄴ그건 알겟는데 ..

 

여기서 op는 함수를 가리키는 변수입니다. 이 함수는 두 개의 Int를 매개변수로 받아서 Int를 반환한다는 것을 앞서 (Int, Int) -> Int 타입 표시로 알 수 있었습니다.

ㄴ 그렇지 그랬었지..

 

따라서 op(a, b)op 함수에 ab를 매개변수로 전달하여 호출하는 것을 의미합니다. 그리고 op(a, b)의 결과값은 Int 타입이며, 이 값이 return op(a, b)에서 반환되는 값입니다.

ㄴ 그러치.. 근데 숫자를 덩그러니 띡띡 2개 쓰고 마는거야 ? 이해가 안되네 이걸 왜 리턴하는거야 

 

예를 들어, sum 함수를 op로 전달하면 op(a, b)sum(a, b)가 되어 ab의 합을 반환하게 됩니다.

ㄴ 음 그럴라고 숫자 2개 미리 써놓는건가 ? 

 

따라서 return op(a, b) 코드는 op 함수를 호출하여 계산된 결과값을 반환하는 코드입니다. 이는 고차 함수에서 주로 사용되는 패턴으로, 함수를 매개변수로 전달받아 그 함수를 호출하고 결과를 반환하는 방식을 나타냅니다.

ㄴ 좋아 대충 이해했어.


좋아 마지막 3번째 줄 !!

fun main() {
    val result = operate(5, 10, ::sum)
    println(result)  // 출력: 15
}

 

해석해보기 ▼

fun main() {}  // 메인 함수다. 그 뒤에 중괄호 안에는 메인함수가 할 행위가 있지.

 

{}중괄호 안 ▽

{
    val result = operate(5, 10, ::sum)
    println(result)  // 출력: 15
}

 

자. 중괄호안에는 

 

val result 가 있지. 여기서 val은 상수로 변하지 않는 값을 의미한다.

 

operate(5, 10, ::sum) 이것은 oprate에 5, 10, ::sum을 넣으라는 말이지.  자 :: 의 의미에 대해선 오늘 배웠지. 일반 함수를 고차함수로 변경해주는 연산자지. 그렇기 때문에 이곳에 들어올 수 있었지.

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

fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

fun main() {
    val result = operate(5, 10, ::sum)
    println(result)  // 출력: 15
}

전체 코드를 보면, operate는 a , b, op 매개변수가 있는데.

지금 마지막줄에서 operate(5, 10, ::sum) 가 나왔으니 각각 a = 5 / b = 10 / op = ::sum .이 되었겠지.

여기서부터 어떻게 움직여서 sum이 되었는가.

정확한 경로는 모르겠지만 op와 sum이 operate 안에 들어감으로써 모종의 관계가 생겼고 'ㅇ'....

그렇게 ...

5 + 10이 된거지 

 

 

ㅎ ㅏ 아직 나의 이해에는 한 50% 조금 부족해 ㅠ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형