고차함수
정의
- 함수를 마치 클래스에서 만들어 낸 ‘인스턴스처럼’ 취급하는 방법
- 함수를 ‘parameter’로 넘겨 줄 수 있고, ‘결과값으로 반환’ 받을 수도 있다.
사용 방법
- :: 사용 - ::는 일반 함수를 고차 함수로 변경해 주는 연산자
밑의 코드는 함수 a를 고차함수 형식의 parameter로 받을 수 있도록 하는 예시이다.
1
2
3
4
5
6
7
8
9
10
11
fun a(str: String){
println("$str 함수 a")
}
fun b (function: (String) -> Unit){
function("b가 호출한")
}
fun main(){
b(::a)
}
- 위 코드를 보면, 함수 b에서 a 함수의 형식을 넘겨받을 수 있도록 해야 한다.
- 함수 a의 parameter를 ()안에 나열하고, -> 를 이용하여 함수 a의 반환형 자료형을 기술한다.
- 함수 a의 parameter는 String 한 개이고, 반환형은 void이므로 Unit으로 기술한다.
- 기술한 형태와 같은 형식의 함수는 모두 parameter로 받을 수 있다.
람다함수
정의
- 일반함수와 달리 그 자체가 고차함수여서 별도의 연산자 없이도 변수에 담을 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fun b (function: (String) -> Unit){
function("b가 호출한")
}
fun main(){
val c: (String) -> Unit = {str -> println("$str 람다함수")} // str은 String으로 받아온 값을 람다함수 내에서 사용할 변수 이름
b(c) // 람다함수는 그 자체가 고차함수 --> :: 필요없다
val d = {str:String -> println("$str 람다함수")} // 변수 d의 자료형을 기술하지 않고 람다식 안에만 parameter 자료형 기술
val calculate:(Int, Int) -> Int = {a, b ->
println(a)
println(b)
a+b //반환값
} // 여러 줄 구성 가능
val noParams:() -> Unit = {println("parameter 없는 람다 함수")}
//parameter가 1개라면 it을 사용
val oneParam: (String) -> Unit = {println("$it 람다함수")}
}
참고사항
- 고차함수와 람다함수는 함수를 일종의 변수로 사용할 수 있다는 편의성과 컬렉션 조작 및 스코프 함수 사용에도 도움이 된다.