고차함수란?
일급 함수이면서 일급객체를 사용할 수 있는 것이다. 일급 함수란 함수가 변수 역할을 하는 것이고, 일급 객체란 함수의 실 인자로 사용할 수 있으며, 함수의 반환 값으로도 사용할 수 있는 것이다.
일반 함수와 고차함수의 차이
// 일반 함수
fun multiply(a: Int, b: Int): Int {
return a * b
}
일반 함수는 위와 같이 변수만 인자로 받아서 그 변수들을 통해 연산을 해서 값을 반환한다.
fun multiply(a: Int, b: Int, hfunc:(Int, Int) -> Int): Int {
return hfunc(a, b)
}
하지만 고차함수는 함수를 인자로 받을 수 있다. 즉, 인자로 전달 받은 함수와 전달 받은 변수의 값들을 이용해서 값을 반환한다. 따라서, 매번 다른 함수를 인자로 전달한다면 매번 다른 연산을 통해서 값을 반환할 수 있다.
고차함수를 사용하는 방법
// 기본적인 선언 방식
fun 고차함수명(변수1: 변수타입, 변수2: 변수타입, 함수명: (입력 타입1, 입력 타입2) -> 반환 타입): 고차함수 반환타입 {
return 함수명(변수1, 변수2)
}
사용 방법 1
//고차함수
fun multiply(a: Int, b: Int, hfunc:(Int, Int) -> Int): Int {
return hfunc(a, b)
}
//전달할 함수
fun myPureFunc(p:Int, q:Int): Int = p * q
fun main() {
//고차함수 사용
val result = multiply(2, 3, ::myPureFunc)
println(result) //6
}
이렇게 ::을 사용해서 고차함수에 인자값으로 함수를 전달할 수 있다.
사용 방법 2
//전달할 함수
fun myPureFunc(p:Int, q:Int): Int = p * q
fun main() {
//고차함수 사용
val tmp = ::myPureFunc
println(tmp(2, 3)) //6
}
또 다른 방식으로는 변수에 전달할 인자를 ::와 함께 사용해서 저장하면 해당 변수는 고차함수를 참조하게 된다. 따라서 변수를 고차함수처럼 사용할 수 있다.
함수의 타입들
(Int, Int) -> Int
: Int타입의 변수 2 개를 입력으로 받고, Int타입 1개를 출력하는 것
(Int) -> Unit
: Int타입의 변수 1 개를 입력으로 받고, 출력값은 없는 것
() -> Int
: 입력을 받지 않고, Int타입 1개를 출력하는 것
(Int, Int) -> Int?
: Int타입의 변수 두개를 입력으로 받고, Int타입 1개를 출력하거나 null 값을 출력하는 것
((Int, Int) -> Int)?
: Int타입의 변수 두개를 입력으로 받고, Int타입 1개를 출력할 수 있지만 / 아무 함수도 전달 받지 않을 수 있는 것
'2학년 2학기 > 모바일 소프트웨어 - 코틀린' 카테고리의 다른 글
람다식(1) - 기본적인 선언과 호출, 고차함수와의 사용 (0) | 2024.10.10 |
---|---|
고차함수(2) - 응용편 (0) | 2024.10.10 |
Kotiln - 함수 (0) | 2024.10.10 |
Class(1) - 중첩 클래스와 내부 클래스 (0) | 2024.10.01 |
Class(1) - 추상 클래스와 인터페이스 (0) | 2024.10.01 |