22. fun main(args: Array<String>) {
val number1 = 10
val number2 = 2
println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}")
println("addGT5Number2: ${addGT5Number2(number2)}")
println("addLT10Number1: ${addLT10Number1(number1)}")
println("-------------------------------------------")
println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}")
println("addGT5Number2: ${addGT5Number2(number2)}")
println("addLT10Number1: ${addLT10Number1(number1)}")
println("-------------------------------------------")
println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}")
println("addGT5Number2: ${addGT5Number2(number2)}")
println("addLT10Number1: ${addLT10Number1(number1)}")
}
전역에서 지역으로
23. 순수하지 못한 함수에서 순수한 함수로
fun main(args: Array<String>) {
val number1 = 10
val number2 = 2
println("add...: ${addGT5Number1LT10Number2(number1, number2)}")
println("addGT5Number2: ${addGT5Number2(number1, number2)}")
println("addLT10Number1: ${addLT10Number1(number1, number2)}")
println("-------------------------------------------")
println("add...: ${addGT5Number1LT10Number2(number1, number2)}")
println("addGT5Number2: ${addGT5Number2(number1, number2)}")
println("addLT10Number1: ${addLT10Number1(number1, number2)}")
println("-------------------------------------------")
println("add...: ${addGT5Number1LT10Number2(number1, number2)}")
println("addGT5Number2: ${addGT5Number2(number1, number2)}")
println("addLT10Number1: ${addLT10Number1(number1, number2)}")
}
fun addLT10Number1(number1: Int, number2: Int): Int {
return if (number1 < 10) number1 + number2
else -1
}
fun addGT5Number2(number1: Int, number2: Int): Int {
return if (number2 > 5) number1 + number2
else -1
}
fun addGT5Number1LT10Number2(number1: Int, number2: Int): Int {
return if (number1 > 5 && number2 < 10) number1 + number2
else -1
}
24. 일급 함수
● 함수를 변수나 데이터 구조에 담을 수 있다.
● 함수를 파라미터로 전달할 수 있다.
● 함수를 반환값으로 사용할 수 있다.
25. 일급 함수
fun main(args: Array<String>) {
val functionValue: (Int) -> Int = { a ->
a * a
}
println("result : ${functionValue(2)}")
}
26. fun functionInFunction(func: (Int) -> Int, number: Int): Int {
return func.invoke(number)
}
fun main(args: Array<String>) {
val functionValue: (Int) -> Int = { a->
a * a
}
println("result : ${functionInFunction(functionValue, 2)}")
}
일급 함수
27. fun functionInFunction(a: Int): (Int) -> Int = { b ->
a * b
}
fun main(args: Array<String>) {
println("result : ${functionInFunction(2)(2)}")
}
일급 함수
29. 고차 함수
fun functionInFunction(func: (Int) -> Int, number: Int): Int {
return func.invoke(number)
}
fun main(args: Array<String>) {
val functionValue: (Int) -> Int = { a->
a * a
}
println("result : ${functionInFunction(functionValue, 2)}")
}
30. fun functionInFunction(a: Int): (Int) -> Int = { b ->
a * b
}
fun main(args: Array<String>) {
println("result : ${functionInFunction(2)(2)}")
}
고차 함수
31. var result = 0
var number1 = 10
var number2 = 2
fun main(args: Array<String>) {
println("result : ${calc(number1, number2, '*')}")
}
고차함수
fun calc(number1: Int, number2: Int, operator: Char): Int {
return when (operator) {
'+' -> number1 + number2
'-' -> number1 - number2
'*' -> number1 * number2
else -> -1
}
}
32. 순수함수에 고차함수 적용
fun calc(number1: Int, number2: Int, operator: Char): Int
{
return when (operator) {
'+' -> number1 + number2
'-' -> number1 - number2
'*' -> number1 * number2
else -> -1
}
}
fun calc(number1: Int, number2: Int, inFunction: (Int, Int) -> Int): Int {
return inFunction.invoke(number1, number2)
}
37. 선언형 프로그래밍과 함수형 프로그래밍 비교
선언형 프로그래밍
● 알고리즘을 명시하고 목표를
명시하지 않음
● 상태변경 O
● 주요 흐름 제어로는 반복문, 조건 및
함수(메소드) 호출
● 클래스나 구조체, 인스턴스
함수형 프로그래밍
● 알고리즘을 명시하지 않고 목표를
명시함
● 상태변경 X
● 원하는 정보와 필요한 반환
● 재귀를 비롯한 함수 응용
● 일급 객체와 데이터 컬렉션 함수