-
[Kotlin] 고차함수와 람다함수코틀린 공부/코틀린 기초 2024. 5. 22. 11:22
1. 람다 함수란?
람다 함수는 일반 함수와 다르게 fun 키워드도 사용하지 않으며 함수 이름도 없이 변수에 대입해서 사용한다. (익명 함수)
// 일반적인 함수 선언 방식 fun plus(a: Int, b: Int) : Int { return a + b } // 람다 함수 선언 방식 val sum = {a:Int, b:Int -> a+b}
위의 plus함수는 일반적인 함수의 선언 방식이고
아래 sum에 할당된 것이 람다 함수이다.
1-1 람다 함수 규칙
- { ... } 로 표현한다.
- { ... } 안에 -> 가 있으면 왼쪽은 parameter, 오른쪽은 함수의 본문이다.
- 함수의 return 값은 함수 본문의 마지막 표현식이다.
즉 위에서 sum 에는 a+b의 값이 할당된다.
1-2 선언 방법
val sum = {a:Int, b:Int -> a+b} sum(10, 20)
익명함수 매개변수 a,b에 각각 10, 20이 할당되어 있으며 결과 값으로는 a+b가 되어 있기 때문에 sum(10,20)은 30을 return 할 것이다.
1-3 매개변수 없을때
매개변수가 없다면 왼쪽부분과 -> 화살표를 생략할 수 있다.
val print = { val a = 1 val b = 3 a+b }
print의 값은 a+b의 값인 4가 될것이다.
1-4 람다 함수 타입
- 코틀린의 타입 추론으로 인해 변수 타입을 지정하지 않아도 람다를 변수에 대입할 수 있다.
val sum1 = { a: Int, b: Int -> a + b } println("1 : sum ${sum1(2, 3)}") // 1 : sum 5
- 타입 선언을 추가하면 아래와 같은 방식으로도 사용 가능하다.
val sum2: (Int, Int) -> Int = { a, b -> a + b } println("2 : sum ${sum2(4, 6)}") // 2 : sum 10
- 코틀린에는 아무것도 반환안하는 Unit 타입이 있다. 일반 함수에서는 아무것도 반환을 안할 경우 생략이 가능하지만 람다함수 에서는 반드시 추가해줘야 한다.
val sum3 = { a: Int, b: Int -> println("${a+b}") } val sum4: (Int, Int) -> Unit = { a, b -> println("${a+b}")}
2. 고차함수란?
고차 함수란 다른 함수를 parameter로 받거나 함수를 반환하는 함수다.
고차함수에 람다 함수 활용하는 방식으로 활용된다.
그리고 코틀린에서 모든 함수를 고차함수로 사용 가능하다.
2-1 인자로 받은 함수 호출
함수를 인자 형식으로 넘겨주려면 인자에 아래와 같이 넘겨주면 된다.
이름 : (고차함수 인자 타입) -> 반환타입
fun highOrderFunctionA(function: (String) -> Unit) { function("B") }
만들어준 highOrderFunctionA를 사용 하려면 아래와 같이 고차함수를 만들고 넣어 줄 수 있다.
val higherFun:(String) -> Unit = {str:String -> println(str)} highOrderFunctionA(higherFun)
인자로 넘겨주는 고차함수의 타입을 생략해도 된다고 해서 생략하고 인자로 넘겼지만 컴파일 오류가 생겼다.
인자로 넘길때 Unit을 제외한 다른 타입은 타입 선언을 생략해줘도 되는 것 같지만 Unit은 반드시 선언이 필요한것 같다.
2-2 일반함수 대입 방법
fun normalFunction(name: String) { println("my name is $name") }
highOrderFunctionA(::normalFunction)
앞에 '::' 을 붙여주면 고차함수처럼 사용 가능하다.
'코틀린 공부 > 코틀린 기초' 카테고리의 다른 글
[Kotlin] object (0) 2024.05.23 [Kotlin] 스코프 함수 (Scope Function) (0) 2024.05.23 [Kotlin] 추상 클래스와 인터페이스 (0) 2024.05.21 [Kotlin] 코틀린 class (open, data , sealed, internal class) (0) 2024.05.17 [Kotlin] 코틀린 생성자(Constructor) (0) 2024.05.17