Home 고차함수와 람다함수
Post
Cancel

고차함수와 람다함수

고차함수

정의

  • 함수를 마치 클래스에서 만들어 낸 ‘인스턴스처럼’ 취급하는 방법
    • 함수를 ‘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 람다함수")}
}

참고사항

  • 고차함수와 람다함수는 함수를 일종의 변수로 사용할 수 있다는 편의성과 컬렉션 조작 및 스코프 함수 사용에도 도움이 된다.