Daily Kotlin - 람다식, 일급객체, 고차함수, 함수, Unit, default 매개변수, vararg
-
람다식 : 다른 함수의 인자로 넘기는 함수, 함수의 결괏값으로 반환하는 함수, 변수에 저장하는 함수
-
일급 객체 : 함수의 인자로 전달할 수 있고, 함수의 반환값에 사용될 수 있고, 변수에 담을 수 있는 객체
-
고차 함수 : 다른 함수를 인자로 사용하거나 함수를 결괏값으로 반환하는 함수
-
함수형 프로그래밍의 특징 : 순수 함수 이용, 람다식 사용, 고차함수 사용
-
함수 작성법
package chap03.section1
fun sum(a: Int, b: Int): Int {
var sum = a + b
return sum
}
fun sum2(a: Int, b: Int): Int {
return a + b
}
fun sum3(a: Int, b: Int): Int = a + b
fun sum4(a: Int, b: Int) = a + b
fun main() {
val res1 = sum(3, 2)
val res2 = sum2(6, 7)
println(res1)
println(res2)
}
- Unit 자료형 : 반환값이 없을 때 사용
fun printSum(a: Int, b: Int): Unit {
println("sum of ${a} and ${b} is ${a+b}")
}
- default 매개변수
package chap03.section1
fun main() {
val name = "고려대"
val email = "webmaster@korea.ac.kr"
add(name)
add(name, email)
add("연세대", "chicken@yonsei.ac.kr")
defaultArgs()
defaultArgs(300)
}
fun add(name: String, email: String = "default") {
val output = "${name}님의 이메일은 ${email} 입니다."
println(output)
}
fun defaultArgs(x: Int = 100, y: Int = 200) {
println(x+y);
}
고려대님의 이메일은 default 입니다.
고려대님의 이메일은 webmaster@korea.ac.kr 입니다.
연세대님의 이메일은 chicken@yonsei.ac.kr 입니다.
300
500
- vararg : 다양한 인자의 개수를 전달받는 함수
package chap03.section1
fun main() {
normalVarargs(1, 2, 3, 4)
normalVarargs(4, 5, 6)
}
fun normalVarargs(vararg counts: Int) {
for (num in counts) {
print("$num ")
}
print("\n")
}
1 2 3 4
4 5 6
- 변수에 람다식 함수 작성
package chap03.section3
fun main() {
var result: Int
var multi = {x: Int, y: Int -> x * y}
result = multi(10, 20)
println(result)
}
200
- 매개변수에 람다식 함수를 이용한 고차함수
package chap03.section3
fun main() {
var res: Int
res = highOrder({x, y -> x + y}, 10, 20)
println(res)
}
fun highOrder(sum: (Int, Int) -> Int, a: Int, b: Int): Int {
return sum(a, b)
}
30
- 인자와 반환값이 없는 람다식 함수
package chap03.section3
fun main() {
val out: () -> Unit = {println("Hello Kotlin")}
out()
val new = out
new()
}
- Call By Value로 람다식 사용
package chap03.section3
fun main() {
val result = callByValue(lambda())
println(result)
}
fun callByValue(b: Boolean): Boolean {
println("callByValue function")
return b
}
val lambda: () -> Boolean = {
println("lambda function")
true
}
lambda function
callByValue function
true
- Call By Name으로 람다식 호출
package chap03.section3
fun main() {
val res = callByName(otherLambda)
println(res)
}
fun callByName(b: () -> Boolean): Boolean { //람다식 자료형 매개변수
println("callByName function")
return b()
}
val otherLambda: () -> Boolean = {
println("otherLambda function")
true
}
callByName function
otherLambda function
true
- Call By Reference로 일반 함수 호출
package chap03.section3
fun main() {
val res1 = funcParam(3, 2, ::sum)
println(res1)
hello(::text)
val likeLambda = ::sum
println(likeLambda(6, 6))
}
fun sum(a: Int, b: Int) = a + b
fun text(a: String, b: String) = "Hi! $a, $b"
fun funcParam(a: Int, b: Int, c: (Int, Int) -> Int): Int {
return c(a, b)
}
fun hello(body: (String, String) -> String): Unit {
println(body("Hello", "Kotlin"))
}
5
Hi! Hello, Kotlin
12
- 다중 매개변수 람다식
람다식 매개변수가 1개인 경우, {a -> "Something $a"}
는 {"Something $it}
과 같다.
package chap03.section3
fun main() {
twoLambda({a, b -> "First $a $b"}, {"Second $it"})
}
fun twoLambda(first: (String, String) -> String, second: (String) -> String) {
println(first("OneParam", "TwoParam"))
println(second("OneParam"))
}
First OneParam TwoParam
Second OneParam
Comments