SlideShare a Scribd company logo
함수형 프로그래밍?
그래서 어떻게?(Kotlin)
김규하
목차
1. 함수형 프로그래밍
2. 순수한 함수
3. 불변성
4. 일급객체
5. 고차함수
● 함수형 프로그래밍이란 자료처리를 수학적 함수의
계산으로 취급하고 상태와 가변 데이터를 멀리하는
프로그래밍 패러다임 중 하나
함수형 프로그래밍?
● 함수형 프로그래밍이란 자료처리를 수학적 함수의
계산으로 취급하고 상태와 가변 데이터를 멀리하는
프로그래밍 패러다임 중 하나
함수형 프로그래밍?
● 함수형 프로그래밍이란 자료처리를 수학적 함수의
계산으로 취급하고 상태와 가변 데이터를 멀리하는
프로그래밍 패러다임 중 하나
함수형 프로그래밍?
순수한 함수
f(x) = y
f(3) = 6
var number3 = 5
fun add(number1: Int, number2: Int) : Int {
return number1 + number2 + number3
}
fun add(number1: Int, number2: Int) : Int {
return number1 + number2
}
순수하지 못한 함수순수한 함수
fun add(number1: Int, number2: Int) {
var result = number1 + number2
}
fun justTen(): Int {
return 10
}
순수한듯 순수하지 못한 함수
순수한 함수
1. 함수에 입력값이 같으면 항상 동일한 결과를
출력한다.
2. 최소한의 입력과 최소한의 출력이 있어야 한다.
fun calc(operator: Char) {
result = when (operator) {
'+' -> number1 + number2
'-' -> number1 - number2
'*' -> number1 - number2
else -> -1
}
}
순수하지 못한 함수
var result = 0
var number1 = 10
var number2 = 2
fun main(args: Array<String>) {
calc('*')
println("result : $result")
calc('*')
result = -1
println("result : $result")
}
순수하지 못한 함수를 순수한 함수로
fun calc(operator: Char) {
result = when (operator) {
'+' -> number1 + number2
'-' -> number1 - number2
'*' -> number1 - number2
else -> -1
}
}
fun calc(number1: Int, number2: Int, operator: Char): Int {
return when (operator) {
'+' -> number1 + number2
'-' -> number1 - number2
'*' -> number1 - number2
else -> -1
}
}
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
}
}
불변성?
불변성
val x = 1 var x = 1
x = x + 1x = x + 1
불변성
val x = 1 var x = 1
불변성
val y = x + 1
불변성
val immutableList: List<Int> = listOf(1, 2, 3)
println("immutableList : $immutableList")
val immutableList2 = immutableList.plus(4)
println("immutableList : $immutableList")
println("immutableList2 : $immutableList2")
val mutableList: MutableList<Int> = mutableListOf(1, 2, 3)
println("mutableList : $mutableList")
mutableList.add(4)
println("mutableList : $mutableList")
불변성
● 부수 효과가 없다.
● 프로그램의 복잡도가 낮아진다.
● 멀티 쓰레딩 환경에서의 개발에 용이하다.
불변성
fun addLT10Number1(number1: Int): Int {
return if (number1 < 10) number1 + number2
else -1
}
fun addGT5Number2(number2: Int): Int {
return if (number2 > 5) number1 + number2
else -1
}
fun addGT5Number1LT10Number2(): Int {
return if (number1 > 5 && number2 < 10) number1 + number2
else -1
}
var number1 = 10
var number2 = 2
fun main(args: Array<String>) {
println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}")
println("addGT5Number2: ${addGT5Number2(number2)}")
println("addLT10Number1: ${addLT10Number1(number1)}")
println("-------------------------------------------")
number1 = 25
number2 = 3
println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}")
println("addGT5Number2: ${addGT5Number2(number2)}")
println("addLT10Number1: ${addLT10Number1(number1)}")
println("-------------------------------------------")
number1 = 7
number2 = 7
println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}")
println("addGT5Number2: ${addGT5Number2(number2)}")
println("addLT10Number1: ${addLT10Number1(number1)}")
}
가변성에서 불변성으로
var number1 = 10
var number2 = 2
fun main(args: Array<String>) {
println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}")
println("addGT5Number2: ${addGT5Number2(number2)}")
println("addLT10Number1: ${addLT10Number1(number1)}")
number1 = 25
number2 = 3
println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}")
println("addGT5Number2: ${addGT5Number2(number2)}")
println("addLT10Number1: ${addLT10Number1(number1)}")
number1 = 7
number2 = 7
println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}")
println("addGT5Number2: ${addGT5Number2(number2)}")
println("addLT10Number1: ${addLT10Number1(number1)}")
}
가변성에서 불변성으로
val number1 = 10
val number2 = 2
fun main(args: Array<String>) {
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)}")
}
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)}")
}
전역에서 지역으로
순수하지 못한 함수에서 순수한 함수로
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
}
일급 함수
● 함수를 변수나 데이터 구조에 담을 수 있다.
● 함수를 파라미터로 전달할 수 있다.
● 함수를 반환값으로 사용할 수 있다.
일급 함수
fun main(args: Array<String>) {
val functionValue: (Int) -> Int = { a ->
a * a
}
println("result : ${functionValue(2)}")
}
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)}")
}
일급 함수
fun functionInFunction(a: Int): (Int) -> Int = { b ->
a * b
}
fun main(args: Array<String>) {
println("result : ${functionInFunction(2)(2)}")
}
일급 함수
고차 함수
● 파라미터에 함수가 넘어오는 함수
● 반환하는 값이 함수인 함수
고차 함수
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)}")
}
fun functionInFunction(a: Int): (Int) -> Int = { b ->
a * b
}
fun main(args: Array<String>) {
println("result : ${functionInFunction(2)(2)}")
}
고차 함수
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
}
}
순수함수에 고차함수 적용
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)
}
fun main(args: Array<String>) {
val number1 = 10
val number2 = 2
println("result : ${calc(number1, number2, {n1, n2 -> n1 / n2})}")
println("result : ${calc(number1, number2, {n1, n2 -> n1 % n2})}")
}
고차함수
fun calc(number1: Int, number2: Int, inFunction: (Int, Int) -> Int): Int {
return inFunction.invoke(number1, number2)
}
fun main(args: Array<String>) {
val number1 = 10
val number2 = 2
println("result : ${calc(number1, number2, {n1, n2 -> n1 / n2})}")
println("result : ${calc(number1, number2, {n1, n2 -> n1 % n2})}")
println("result : ${calc(number1, number2, {n1, n2 -> n1 * n2})}")
println("result : ${calc(number1, number2, {n1, n2 -> n1 + n2})}")
println("result : ${calc(number1, number2, {n1, n2 -> n1 - n2})}")
}
고차함수
fun calc(number1: Int, number2: Int, inFunction: (Int, Int) -> Int): Int {
return inFunction.invoke(number1, number2)
}
함수형 프로그래밍의 장단점
1. 변하지 않는 값
2. 결과가 예측 가능한 순수한 함수
3. 적은 사이드 이펙트
4. 높은 추상화로 간결해진 코드
1. 러닝커브
2. 레퍼런스가 부족하다.
3. 지나치게 높은 추상화가
가독성을 해칠 수 있다.
단점
장점
Q&A?
선언형 프로그래밍과 함수형 프로그래밍 비교
선언형 프로그래밍
● 알고리즘을 명시하고 목표를
명시하지 않음
● 상태변경 O
● 주요 흐름 제어로는 반복문, 조건 및
함수(메소드) 호출
● 클래스나 구조체, 인스턴스
함수형 프로그래밍
● 알고리즘을 명시하지 않고 목표를
명시함
● 상태변경 X
● 원하는 정보와 필요한 반환
● 재귀를 비롯한 함수 응용
● 일급 객체와 데이터 컬렉션 함수

More Related Content

PDF
Python Programming: Function
Chan Shik Lim
 
PDF
Fp basic-kotlin
Myeongin Woo
 
PPTX
하스켈로 알고리즘 문제 풀기 2
민석 이
 
PPTX
하스켈로 알고리즘 문제 풀기
민석 이
 
PDF
Tensorflow regression 텐서플로우 회귀
beom kyun choi
 
PPTX
하스켈 성능 튜닝 2
민석 이
 
PPTX
하스켈 성능 튜닝
민석 이
 
PDF
고등학생 R&E Python summary for test
Kyunghoon Kim
 
Python Programming: Function
Chan Shik Lim
 
Fp basic-kotlin
Myeongin Woo
 
하스켈로 알고리즘 문제 풀기 2
민석 이
 
하스켈로 알고리즘 문제 풀기
민석 이
 
Tensorflow regression 텐서플로우 회귀
beom kyun choi
 
하스켈 성능 튜닝 2
민석 이
 
하스켈 성능 튜닝
민석 이
 
고등학생 R&E Python summary for test
Kyunghoon Kim
 

What's hot (20)

PPTX
파이썬 스터디 2주차
Han Sung Kim
 
PPTX
빠르게 활용하는 파이썬3 스터디(ch1~4)
SeongHyun Ahn
 
PPTX
하스켈 프로그래밍 입문 2
Kwang Yul Seo
 
PPTX
하스켈 프로그래밍 입문
Kwang Yul Seo
 
PDF
Swift의 함수와 메소드
Changwon National University
 
PDF
하스켈 모나드
Kwang Yul Seo
 
PDF
자료구조 프로젝트
hyungoh kim
 
PPTX
영상 데이터의 처리와 정보의 추출
동윤 이
 
PDF
[Swift] Data Structure - Dequeue
Bill Kim
 
PDF
알고리즘과 자료구조
영기 김
 
PDF
Coursera Machine Learning으로 기계학습 배우기 : week2
Kwangsik Lee
 
PDF
Es2015 Simple Overview
Kim Hunmin
 
PPTX
종이접기(fold) 프로그래밍
Kwang Yul Seo
 
PDF
React로 TDD 쵸큼 맛보기
Kim Hunmin
 
PDF
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
Taeyoung Kim
 
PDF
Example
유석 남
 
PDF
ALS WS에 대한 이해 자료
beom kyun choi
 
PDF
함수적 사고 2장
HyeonSeok Choi
 
PDF
ES6 for Node.js Study 5주차
승빈이네 공작소
 
PDF
IPython
Kyunghoon Kim
 
파이썬 스터디 2주차
Han Sung Kim
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
SeongHyun Ahn
 
하스켈 프로그래밍 입문 2
Kwang Yul Seo
 
하스켈 프로그래밍 입문
Kwang Yul Seo
 
Swift의 함수와 메소드
Changwon National University
 
하스켈 모나드
Kwang Yul Seo
 
자료구조 프로젝트
hyungoh kim
 
영상 데이터의 처리와 정보의 추출
동윤 이
 
[Swift] Data Structure - Dequeue
Bill Kim
 
알고리즘과 자료구조
영기 김
 
Coursera Machine Learning으로 기계학습 배우기 : week2
Kwangsik Lee
 
Es2015 Simple Overview
Kim Hunmin
 
종이접기(fold) 프로그래밍
Kwang Yul Seo
 
React로 TDD 쵸큼 맛보기
Kim Hunmin
 
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
Taeyoung Kim
 
Example
유석 남
 
ALS WS에 대한 이해 자료
beom kyun choi
 
함수적 사고 2장
HyeonSeok Choi
 
ES6 for Node.js Study 5주차
승빈이네 공작소
 
IPython
Kyunghoon Kim
 
Ad

Similar to 함수형 프로그래밍? 그래서 어떻게 (20)

PPTX
Feel functional
WonJun Lee
 
PPTX
Kotlin with fp
Myeongin Woo
 
PPTX
Functional programming
ssuserdcfefa
 
PPTX
함수형 사고 - Functional thinking
재문 심
 
PPTX
Functional programming
ssuserdcfefa
 
PDF
Haskell study 5
Nam Hyeonuk
 
PPT
Swift basic operators-controlflow
wileychoi
 
PDF
스칼라와 스파크 영혼의 듀오
Taeoh Kim
 
PDF
키트웍스_발표자료_김경수functional_programming240920.pdf
Wonjun Hwang
 
PPTX
함수형 프로그래밍
Min-su Kim
 
PDF
Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019
Suhyun Park
 
PDF
Haskell study 10
Nam Hyeonuk
 
PDF
Pure Function and Rx
Hyungho Ko
 
PDF
How to Study Mathematics for ML
Dataya Nolja
 
PDF
Scala 기초 (2)
명성 정
 
PDF
Pure Function and Honest Design
Hyungho Ko
 
PDF
About Functional Programming Paradigms
Junho Yeo
 
PDF
일단 시작하는 코틀린
Park JoongSoo
 
PDF
[15]Android Kotlin을 통한 개발 전략
NAVER Engineering
 
PDF
Haskell study 4
Nam Hyeonuk
 
Feel functional
WonJun Lee
 
Kotlin with fp
Myeongin Woo
 
Functional programming
ssuserdcfefa
 
함수형 사고 - Functional thinking
재문 심
 
Functional programming
ssuserdcfefa
 
Haskell study 5
Nam Hyeonuk
 
Swift basic operators-controlflow
wileychoi
 
스칼라와 스파크 영혼의 듀오
Taeoh Kim
 
키트웍스_발표자료_김경수functional_programming240920.pdf
Wonjun Hwang
 
함수형 프로그래밍
Min-su Kim
 
Lazy Propagation on Segment Trees - Sogang ICPC Team, 2019
Suhyun Park
 
Haskell study 10
Nam Hyeonuk
 
Pure Function and Rx
Hyungho Ko
 
How to Study Mathematics for ML
Dataya Nolja
 
Scala 기초 (2)
명성 정
 
Pure Function and Honest Design
Hyungho Ko
 
About Functional Programming Paradigms
Junho Yeo
 
일단 시작하는 코틀린
Park JoongSoo
 
[15]Android Kotlin을 통한 개발 전략
NAVER Engineering
 
Haskell study 4
Nam Hyeonuk
 
Ad

함수형 프로그래밍? 그래서 어떻게

  • 2. 목차 1. 함수형 프로그래밍 2. 순수한 함수 3. 불변성 4. 일급객체 5. 고차함수
  • 3. ● 함수형 프로그래밍이란 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 중 하나 함수형 프로그래밍?
  • 4. ● 함수형 프로그래밍이란 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 중 하나 함수형 프로그래밍?
  • 5. ● 함수형 프로그래밍이란 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 중 하나 함수형 프로그래밍?
  • 7. var number3 = 5 fun add(number1: Int, number2: Int) : Int { return number1 + number2 + number3 } fun add(number1: Int, number2: Int) : Int { return number1 + number2 } 순수하지 못한 함수순수한 함수
  • 8. fun add(number1: Int, number2: Int) { var result = number1 + number2 } fun justTen(): Int { return 10 } 순수한듯 순수하지 못한 함수
  • 9. 순수한 함수 1. 함수에 입력값이 같으면 항상 동일한 결과를 출력한다. 2. 최소한의 입력과 최소한의 출력이 있어야 한다.
  • 10. fun calc(operator: Char) { result = when (operator) { '+' -> number1 + number2 '-' -> number1 - number2 '*' -> number1 - number2 else -> -1 } } 순수하지 못한 함수 var result = 0 var number1 = 10 var number2 = 2 fun main(args: Array<String>) { calc('*') println("result : $result") calc('*') result = -1 println("result : $result") }
  • 11. 순수하지 못한 함수를 순수한 함수로 fun calc(operator: Char) { result = when (operator) { '+' -> number1 + number2 '-' -> number1 - number2 '*' -> number1 - number2 else -> -1 } } fun calc(number1: Int, number2: Int, operator: Char): Int { return when (operator) { '+' -> number1 + number2 '-' -> number1 - number2 '*' -> number1 - number2 else -> -1 } }
  • 12. 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 } }
  • 14. 불변성 val x = 1 var x = 1 x = x + 1x = x + 1
  • 15. 불변성 val x = 1 var x = 1
  • 17. 불변성 val immutableList: List<Int> = listOf(1, 2, 3) println("immutableList : $immutableList") val immutableList2 = immutableList.plus(4) println("immutableList : $immutableList") println("immutableList2 : $immutableList2") val mutableList: MutableList<Int> = mutableListOf(1, 2, 3) println("mutableList : $mutableList") mutableList.add(4) println("mutableList : $mutableList")
  • 18. 불변성 ● 부수 효과가 없다. ● 프로그램의 복잡도가 낮아진다. ● 멀티 쓰레딩 환경에서의 개발에 용이하다.
  • 19. 불변성 fun addLT10Number1(number1: Int): Int { return if (number1 < 10) number1 + number2 else -1 } fun addGT5Number2(number2: Int): Int { return if (number2 > 5) number1 + number2 else -1 } fun addGT5Number1LT10Number2(): Int { return if (number1 > 5 && number2 < 10) number1 + number2 else -1 } var number1 = 10 var number2 = 2 fun main(args: Array<String>) { println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}") println("addGT5Number2: ${addGT5Number2(number2)}") println("addLT10Number1: ${addLT10Number1(number1)}") println("-------------------------------------------") number1 = 25 number2 = 3 println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}") println("addGT5Number2: ${addGT5Number2(number2)}") println("addLT10Number1: ${addLT10Number1(number1)}") println("-------------------------------------------") number1 = 7 number2 = 7 println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}") println("addGT5Number2: ${addGT5Number2(number2)}") println("addLT10Number1: ${addLT10Number1(number1)}") }
  • 20. 가변성에서 불변성으로 var number1 = 10 var number2 = 2 fun main(args: Array<String>) { println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}") println("addGT5Number2: ${addGT5Number2(number2)}") println("addLT10Number1: ${addLT10Number1(number1)}") number1 = 25 number2 = 3 println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}") println("addGT5Number2: ${addGT5Number2(number2)}") println("addLT10Number1: ${addLT10Number1(number1)}") number1 = 7 number2 = 7 println("addGT5Number1LT10Number2: ${addGT5Number1LT10Number2()}") println("addGT5Number2: ${addGT5Number2(number2)}") println("addLT10Number1: ${addLT10Number1(number1)}") }
  • 21. 가변성에서 불변성으로 val number1 = 10 val number2 = 2 fun main(args: Array<String>) { 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)}") }
  • 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)}") } 일급 함수
  • 28. 고차 함수 ● 파라미터에 함수가 넘어오는 함수 ● 반환하는 값이 함수인 함수
  • 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) }
  • 33. fun main(args: Array<String>) { val number1 = 10 val number2 = 2 println("result : ${calc(number1, number2, {n1, n2 -> n1 / n2})}") println("result : ${calc(number1, number2, {n1, n2 -> n1 % n2})}") } 고차함수 fun calc(number1: Int, number2: Int, inFunction: (Int, Int) -> Int): Int { return inFunction.invoke(number1, number2) }
  • 34. fun main(args: Array<String>) { val number1 = 10 val number2 = 2 println("result : ${calc(number1, number2, {n1, n2 -> n1 / n2})}") println("result : ${calc(number1, number2, {n1, n2 -> n1 % n2})}") println("result : ${calc(number1, number2, {n1, n2 -> n1 * n2})}") println("result : ${calc(number1, number2, {n1, n2 -> n1 + n2})}") println("result : ${calc(number1, number2, {n1, n2 -> n1 - n2})}") } 고차함수 fun calc(number1: Int, number2: Int, inFunction: (Int, Int) -> Int): Int { return inFunction.invoke(number1, number2) }
  • 35. 함수형 프로그래밍의 장단점 1. 변하지 않는 값 2. 결과가 예측 가능한 순수한 함수 3. 적은 사이드 이펙트 4. 높은 추상화로 간결해진 코드 1. 러닝커브 2. 레퍼런스가 부족하다. 3. 지나치게 높은 추상화가 가독성을 해칠 수 있다. 단점 장점
  • 36. Q&A?
  • 37. 선언형 프로그래밍과 함수형 프로그래밍 비교 선언형 프로그래밍 ● 알고리즘을 명시하고 목표를 명시하지 않음 ● 상태변경 O ● 주요 흐름 제어로는 반복문, 조건 및 함수(메소드) 호출 ● 클래스나 구조체, 인스턴스 함수형 프로그래밍 ● 알고리즘을 명시하지 않고 목표를 명시함 ● 상태변경 X ● 원하는 정보와 필요한 반환 ● 재귀를 비롯한 함수 응용 ● 일급 객체와 데이터 컬렉션 함수