앱 개발 공부방

코틀린-함수2 본문

Android-Kotiln

코틀린-함수2

춘행이 2020. 1. 30. 17:42
728x90

함수형 프로그래밍

 

함수형 프로그래밍은 순수 함수를 작성하여 프로그램의 부작용을 줄이는 프로그래밍 기법을 말합니다

함수형 프로그래밍에서는 고차 함수와 람다식을 사용합니다.

함수형 프로그래밍이 무엇인지 알기 위해서는 먼저 순수 함수를 이해해야 합니다.

 

순수 함수

 

만일 어떤 함수가 같은 인자에 대하여 항상 같은 결과를 반환하면 '부작용이 없는 함수'라고 말합니다. 

그리고 부작용이 없는 함수가 함수 외부의 어떤 상태도 바꾸지 않는다면 순수 함수라고 부릅니다

이런 특성 덕분에 순수 함수는 스레드에 사용해도 안전하고 코드를 테스트하기 쉽다는 장점이 있다

 

ex

//순수 함수의 예
fun sum(a:Int,b:Int): Int{
	return a+b
}//동일한 인자인 a,b를 입력받아 항상 a+b를 출력

//순수 함수가 아닌 것의 예
fun check(){
	val test=User.grade()//check()함수에 없는 외부의 User 객체를 사용
    if(test!=null) process(test)//변수 test는 User.grade()의 실행결과에 따라 달라짐
}

 

람다식

 

람다식은 람다 대수에서 유래한 것으로 다음과 같은 형태입니다

 

{x,y -> x+y}//람다식의 예(이름이 없는 함수 형태)

 

위의 식을 보면 함수의 이름이 없고 화살표가 사용되었습니다.

함수형 프로그래밍의 람다식은 다른 함수의 인자로 넘기는 함수, 함수의 결과값을 반환하는 함수, 변수에 저장하는 함수를 말합니다. 

 

고차 함수

 

다른 함수를 인자로 사용하거나 함수를 결과값으로 반환하는 함수를 말합니다

//고차함수 예
fun main(){
	println(highFunc({x,y -> x+y},10,20))//람다식 함수를 인자로 넘김
}

fun highFunc(sum : (Int,Int)->Int,a:Int,b:Int):Int=sum(a+b)//sum 매개변수는 함수

fun highFunc(sum : (Int,Int)->Int,a:Int,b:Int):Int=sum(a+b)에서

highFunc : 고차함수

sum : 람다식 매개변수

(Int,Int)->Int : 자료형이 람다식으로 선언되어 {x,y -> x+y}형태로 인자를 받는 것이 가능

sum(a,b) : 람다식의 표현문에 따라 결국 a+b의 정숫값 결과를 반환

 

ex-변수에 할당하는 람다식 함수 작성하기

package com.example.kotilnex

fun main(){
  var result: Int
    val multi={x:Int, y:Int->x*y}//일반 변수에 람다식 할당
    result=multi(10,20)//람다식이 할당된 변수는 함수처럼 사용 가능
    println(result)
}

실행결과

//다양한 표현 방법
val multi: (Int,Int)->Int={x:Int, y:Int->x*y}//생략되지 않은 전체 표현
val multi={x:Int, y:Int->x*y}//선언 자료형 생략
val multi: (Int,Int)->Int={x, y->x*y}//람다식 매개변수 자료형의 생략
//추론 가능하지 않은 경우
val multi={x,y->x*y}

 

 

만약 람다식 안에 람다식을 넣으면 어떻게 자료형을 지정해야 할까?

val nestedLamda: ()->()->Unit={{println("nesetd")}}

아무것도 없는 람다식 { }에 람다식 {println("nesetd")}을 넣었습니다

그러면 자료형은 ()->()->Unit으로 명시해야 합니다->잘 사용하는 표현은 아닙니다

 

ex-인자와 반환값이 없는 람다식 함수

package com.example.kotilnex

fun main(){
  val out:()->Unit = {println("Hello world")}//인자와 반환값이 없는 람다식의 선언
  //자료형 추론이 가능하므로 val out = {println("Hello world)}와 같이 생략 가능
    out()//함수처럼 사용 가능
    val new = out//람다식이 들어 있는 변수를 다른 변수에 할당
    new()
}

실행결과

 

728x90

'Android-Kotiln' 카테고리의 다른 글

코틀린-함수1  (0) 2020.01.30
코틀린-자료형  (0) 2020.01.29
코틀린-변수  (0) 2020.01.29
Comments