함수 선언이 최우선
순수 함수를 조합하고 소프트웨어를 만드는 방식
메소드와 필드의 연동(Side Effect)이 아닌 함수의 선언과 선언된 함수의 흐름을 연결 하여 프로그래밍 하는 기법 (클로저,Haskell, Lisp, Scala sql, jsp, jetpack compose, swift,kotlin 등)
compose : xml처럼 class, 인스턴스화 하지않고, 코드로 바로 “이거 그려줘” 하는것
일급 객체로서의 함수
부작용(side effect,부수효과)이 없는 순수함수로 정의되는 함수
| 언어/상황 | 음식점 한명추가 | 홍대 특정장소 가는법 |
|---|---|---|
| 절차지향 | 젓가락1개, 숫가락1개, 국그릇 1개…주세여 | 집나와서 왼쪽으로 100m, 2번출구 들어가서 2호선타고 가다가 홍대입구역에서 내려서, 9번출구로 나외….. |
| 선언적 | 여기 한명 더 왔어요 | 주소 던져놓고 “여기 찾아줘” |
Kotlin을 비롯한 몇몇 프로그래밍 언어는 OOP 와 FP를 지원한다. Kotlin은 설계당시 부터 FP 지향을 목적으로 두고 설계되었다
또한 많은 프로그래밍 언어들(Swift, Python등)이 OOP & FP를 지향한다
이러한 프로그래밍 언어를 Multi-Paradigm 또는 Hybrid Language라고 한다.
프로그래밍 패러다임이란 프로젝트에서 문제를 해결하는 프로그램을 작성할 때의 관점 내지 방법론이다. (어떤 프로그래밍이 맞고 아니고 싸울게 아니라 해당 프로젝트의 성격에 맞게 선택하면 되는 것이다.)
프로젝트를 커다란 함수로 보고 순수함수를 조합해 프로그래밍을 하는 방법
fun functionName(,,,){
variables
, , , ,
function(){, , ,}
class OOP{
property
functions
}
}fun sum(num1: Int, num2: Int) : Int {
return num1 + num2
}var num3 = 10
fun sum(num1: Int, num2: Int) : Int {
num3 = 25 //side effect
return num1 + num2
}함수내에 함수, 클래스, 변수 등을 선언가능해야 한다
reflection : 런타임 중 객체의 Meta-Info(클래스,객체,함수객체 등)를 알아 낼 수 있는 기능세트
fun functionReference(arg: Int) = arg * arg
fun main(){
val funRef = ::functionReference
println(funRef(10))
}만약 fun functionReference(arg: Int) = arg * arg 가 클래스 안에 있었으면 클래스이름::functionReference 해서 사용하면 된다
fun functionReference(arg: Int) = arg * arg 함수를 람다로 표현하려면 밑에처럼 사용
val functionVariable = { arg: Int -> arg * arg}
fun main(){
val result = functionVariable(10)
println("""$result""")
}
함수를 인자로 전달한다.
:: 뒤에는 함수만 올 수 있다 (fun만)
fun, class{fun}, object{fun}로 참조함수
package SeSAC_0816_FP
fun pc(salary: Int, month: Int){
println("$month 월 월급은 ${salary/12}")
}
class EmpClassFunRef{
fun pc2(salary: Int, month: Int) = println("$month 월 월급은 ${salary/12}")
}
object EmpObjectRef{
fun pc3(salary: Int, month: Int) = println("$month 월 월급은 ${salary/12}")
}
fun main(){
var pcFunRef :(Int,Int) -> Unit //함수 참조 변수 선언
var a = ::pc
pc(1000,3)
var b = pc(1000,4)
pcFunRef= EmpClassFunRef()::pc2
pcFunRef(10000,3)
pcFunRef = EmpObjectRef::pc3
pcFunRef(100000,3)
}