일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 원스휴먼 황금양 구하기
- 2차계엄
- 유광버섯 통조림
- 비상계엄령
- 홈플러스
- 믹스커피추천
- 원스휴먼 요리
- 계엄령 외신반응
- 시그니처
- 원스휴먼 동물
- 홈플러스 시그니처 모카골드믹스커피
- 계엄령
- 윤석열
- 레시피 파밍
- 국방부
- 커피추천
- 원스휴먼 레시피 파밍
- 1203계엄령
- 원스휴먼 스타크롬
- 원달러환율
- 원스휴먼 황금양털파밍
- 원스휴먼 사료
- 믹스커피
- 원스휴먼 먹이
- 원스휴먼 레시피
- 일론머스크
- 원스휴먼 황금양
- 2차 비상계엄
- 원스휴먼 쿠폰
- Today
- Total
0101011001010111
Kotlin - 오늘하루 고차함수 / 람다함수를 쥐어 뜯어봐도 이해 안간다 무작정 다 찾아보자 . 본문
일단 뭐니뭐니해도 직접 문제를 풀어보는게 좋지 않겠어?!
고차함수,람다함수 의 문제를 풀어보도록 하자.
// 다음의 고차 함수는 두 개의 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 함수에 a와 b를 매개변수로 전달하여 호출하는 것을 의미합니다. 그리고 op(a, b)의 결과값은 Int 타입이며, 이 값이 return op(a, b)에서 반환되는 값입니다.
ㄴ 그러치.. 근데 숫자를 덩그러니 띡띡 2개 쓰고 마는거야 ? 이해가 안되네 이걸 왜 리턴하는거야
예를 들어, sum 함수를 op로 전달하면 op(a, b)는 sum(a, b)가 되어 a와 b의 합을 반환하게 됩니다.
ㄴ 음 그럴라고 숫자 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% 조금 부족해 ㅠ