본문 바로가기
Kotlin Language/Kotlin 기본 문법

Kotlin(코틀린) - 고차함수(Higher-order Function)

by Classic Master 2023. 12. 6.
728x90

고차함수(Higher-order functions)?

  • 고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수입니다. 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있으며, 람다나 함수 참조를 인자로 넘길 수 있거나 람다나 함수 참조를 반환하는 함수입니다.

함수 타입(Function types)

  • 람다를 파라미터로 받는 함수를 정의 하고자 한다면, 람다 파라미터의 타입을 어떻게 선언하는지 알아야됩니다.
    파라미터의 타입을 정의하기 전에 더 간단한 방법으로 람다를 지역 변수에 대입하는 방법을 나열하겠습니다.
    코틀린의 타입 추론으로 덕분에 변수의 타입을 지정하지 않더라도 람다를 변수에 대입할 수 있습니다.

함수 타입 명시

// 타입 추론
val sum = {x: Int, y: Int -> x + y} //int 파라미터를 2개 받아서 int 값을 반환하는 함수
val action = { println(" ") }// 아무 파라미터도 받지 않고 아무 값도 반환하지 않는 함수

// 함수 타입 명시
val sum: (Int, Int) -> Int = {x, y -> x + y}
val action: () -> Unit = { println(42) }
  • -> 좌측: 함수의 파라미터을 괄호 안에 명시
  • -> 우측: 함수의 반환 타입을 명시
  • 함수 타입을 선언할 때는 반환 타입을 반드시 명시해야 한다. (Unit도 마찬가지!)
  • 함수 타입을 지정할 경우 람다의 파라미터 타입을 유추할 수 있으며 람다 내에서 파라미터 타입을 생략할 수 있습니다.

참고

  • 함수 타입 표기법에는 함수 매개변수에 대한 이름을 선택적으로 포함시킬 수 있습니다
  • (x: Int, y: Int) -> Point. 이러한 이름은 매개변수의 의미를 문서화하는 데 사용할 수 있습니다.
  • 함수 타입이 nullable임을 명시하려면 다음과 같이 괄호를 사용합니다: ((Int, Int) -> Int)?.
  • 함수 타입은 괄호를 사용하여 결합할 수도 있습니다: (Int) -> ((Int) -> Unit).
  • 화살표 표기법은 오른쪽 결합성을 갖습니다. (Int) -> (Int) -> Unit는 이전 예와 동일하지만, ((Int) -> (Int)) -> Unit과는 동일하지 않습니다.
  • 함수 타입에 대체 이름을 부여할 수도 있습니다. 이는 타입 별칭(type alias)을 사용하여 가능합니다:

Null 타입

var canReturnNull: (Int, Int) -> Int? = { x,y -> null } 
// 반환 타입이 널이 될 수 있는 타입
var funOrNull: ((Int, Int) -> Int)? = null
// 함수 타입 변수 자체가 널이 될 수 있는 타입
  • 함수 타입에서도 반환 타입이 널이 될 수 있는 타입으로 지정할 수 있습니다.
  • 함수 타입 변수 자체를 널이 될 수 있는 타입으로도 사용이 가능하다.
  • 코드 상으로는 별 차이가 없지만 반환 타입이 널이 될 수 있는 타입 과 함수 타입 변수 자체가 널이 될 수 있는 타입은 차이가 있다는 것을 주의해야 합니다.

인자로 받은 함수 호출

fun Numbers(operation: (Int, Int) -> Int) {
    val result = operation(4, 5)
    println("결과 값은 $result")
}
Numbers { a, b -> a + b}
// 결과: 결과 값은 9
Numbers() { a, b -> a * b }
// 결과: 결과 값은 20
  • 인자로 받은 함수를 호출하는 구문은 일반 함수를 호출하는 구문과 같습니다
728x90
반응형