Kotlin - 함수형 프로그래밍
Updated:
-
함수형 프로그래밍
-
함수형 프로그래밍(Funtional Programming) : 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.(출처) 함수의 유기적 연결 및 동작이 최우선이 되는 프로그래밍 방식으로 함수가 일급 객체로써의 의미를 가지고 순수함수를 이용. ex) Kotlin, Python, Javascript
- 일급 객체 : 일급 객체(영어: first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.(출처)
- 순수함수 : 동일한 인자를 넣었을 떄 항상 동일한 return value를 반환하고, 외부에 영향을 받지 않는 함수
//순수 함수 fun sum(a:Int, b:Int) = a+b //비순수 함수 var a = 1 fun sum(b:Int, c:Int) = a+b+c
-
함수 정의
fun 이름([변수이름 : 자료형, 변수이름: 자료형...]) : [return value 자료형]{ 표현 식 [return value] } //예시 fun sum(a:Int, b:Int): Int{ return a+b } fun sum(a:Int, b:Int) = a+b
- 반환값은 생략 될 수 있으며, 반환값의 자료형을 Unit으로 지정하거나 생략(void 와 같음)
-
매개변수
//default 값을 지정하면 인자 전달을 하지 않고도 함수 실행이 가능 fun add(name:String, email:String = "default"){ //name & email을 저장 } ... add("GilDong") //email을 생략하여 호출 //이름과 함께 호출도 가능하다 fun add3(x:Int = 100, y:Int = 200, z:Int = 300) = x+y+z add3(x = 200, y = 300) //가변 인자를 가진 함수는 'vararg' 를 이용하여 입력을 받을 수 있다. fun main(args:Array<String>){ normalVarargs(1,2,3) normalVarargs(1,2,3,4,5,6) } normalVarargs(vararg counts:Int){ for(num in counts) println("$num") print("\n") }
-
fun avgFunc(initial: Float, vararg numbers:Float): Double{ var result = 0f for(num in numbers){ result += num } println("result : $result, number.size: ${numbers.size}") val avg = result/number.size return (initial + avg).toDouble() } fun main(){ val result = avgFunc(5f, 100f, 90f, 80f)//첫번째 인자 : 초기값, 이후 인자는 가변 인자 println("avg result:$result") }
-
람다식 : 익명 함수를 지칭하는 용어, 코드의 간결함을 위해 사용된다.
- 문법 : (매개변수 목록) -> {실행문}
{}
로 감싸고, 인자는()
로 감싸지 않는다.- 변수에 람다식을 담을경우 인자의 타입을 생략 불가능.
- 인자는 형식 추론이 가능하므로 타입 생략 가능.
val result = {x:Int, y:Int -> x+y} print(result(2,3))
-
고차함수 : 다른함수를 인자로 사용하거나, 함수를 결괏값으로 반환하는 함수. 일급객체 혹은 일급 함수를 서로 주고 받을 수 있는 함수가 고차함수가 된다. (출처)
fun main(){ println(highFun({x,y -> x+y}, 10, 20)) } fun highFun(sum:(Int, Int)->Int, a:Int, b:Int):Int = sum(a,b) //함수 참조는 참조연산자 `::` 이용 가능하다. fun Fun1(input:(String) -> String){ val result = input("a") println(result) } fun Fun2(input:String) : String{ println(input) return str.toUpperCase() } fun main(){ Fun1(::Fun2) } //result a A
-