[코틀린] study day 3

승아·2020년 10월 11일
0

함수 선언

// 함수를 선언하면 스택에 쌓이게 되며 프레임 정보를 가진다
fun sum(a: Int, b: Int): Int {
	return a + b
}
fun sum(a: Int, b: Int): Int = a + b // 간략화된 함수
fun sum(a: Int, b: Int) = a + b // 반환 자료형 생략 가능 Int + Int = Int로 추론

함수형 프로그래밍

  • 코드가 간략하다
  • 테스트가 용이하다
  • 재사용성이 증가한다
  • 람다식, 고차 함수를 사용해 구성한다
  • 순수함수를 사용한다

순수함수(pure function)

  • 부작용이 없는 함수
    • 동일한 입력 인자에 대해서는 항상 같은 결과를 출력 혹은 반환 한다.
    • 값이 예측이 가능해 결정적이다.
  • 순수 함수의 조건
    • 같은 인자에 대하여 항상 같은 값을 반환한다.
    • 함수 외부의 어떤 상태도 바꾸지 않는다.
// 순수함수의 예
fun sum(a: Int, b: Int): Int{
	return a + b
   }
// 순수 함수가 아닌 것
fun check(){
	val test = User.grade() // 외부 객체 사용
    if (test != null) process(test) // test는 User.grade()의 실행 결과에 따라 달라짐
    }
  • 순수 함수의 장점
    • 모듈화 하므로 재사용성 증가
    • 특정 상태에 영향을 주지 않으므로 병행 작업 시 안전
    • 함수의 값을 추적하고 예측 할 수 있기때문에 테스트, 디버깅 등이 유리

람다식(Lambda Expression)

  • 익명 함수의 하나의 형태로 이름 없이 사용 및 실행 가능
    { x, y -> x + y } // 람다식

고차 함수(high-order function)

  • 매개변수의 람다식을 포함하는 함수
val sum: (Int, Int) -> Int = {x: Int, y: Int -> x + y }
val sum = {x: Int, y: Iny -> x + y} // 선언 자료형 생략
val sum (Int, Int) -> Int = {x,y -> x + y} //람다식 매개변수 자료형 생략

val greet: () -> Unit = {println("Hello Kotlin") } // 반환 자료형이 없을 때
val square: (Int)->Int = {x -> x*x} // 매개변수가 하나 일 때
val nestedLambda: ()->()->Unit = {{println("nested")}} // 람다식 안에 람다식이 있는 경우 
  • 다른 함수 참조에 의한 호출
fun sum(x: Int, y: Iny) = x + y
func Param(3, 2, sum) // 에러 sum은 람다식이 아니다
func Param(3, 2, ::sum) // ::함수명으로 표현해줘야 함
  • 매개변수 개수에 따라 람다식 구성 방법
// 매개변수가 없을 경우
fun main(){
	noParam({"Hello World!"})
    noParam{ "Hello World!" } // 소괄호 생략 가능
}
fun noParam(out: () -> String) = println(out())
// 매개변수가 한 개인 경우
fun main(){
	oneParam({a -> "Hello World! $a" })
    oneParam{ a -> "Hello World! $a" } // 소괄호 생략 가능
    oneParma { "Hello World! $it" } 
}
fun oneParam(out: (String) -> String){
	prlintln(out("OneParam"))
}
// 매개변수를 생략하는 경우
moreParam { _, b -> "Hello World! $b"} // 첫번째 문자열은 생략
// 마지막 인자가 람다식인 경우 소괄호 바깥으로 분리가능
withArgs("Arg1", "Arg2") { a,b -> "Hello World! $a $b" }

익명 함수(anonymous functions)

  • 이름이 없는 함수
fun (x: Int, y: Int): Int = x + y
val add: (Int, Int) -> Int = fun(x,y) = x + y
val result = add(10,2)
val add = fun(x:Int, y: Int) = x + y
val add = { x: Int, y: Int -> x + y }
  • 람다식과 달리 return, break, continue 사용 가능

인라인(inline)함수

  • 함수가 호출되는 곳에 내용을 모두 복사
  • 함수의 분기 없이 처리하여 성능 증가
  • 코드가 복사되므로 내용이 많을수록 코드가 늘어난다
  • noline 키워드 사용 가능 일부 람다식 함수를 인라인 하지 않음
inline fun shortFunc(a: Int,noinline out: (Int) -> Unit){
    println("Hello")
    out(a)
}
  • crossinline으로 return 금지

확장 함수(extension function)

  • 클래스의 멤버 함수를 외부에서 더 추가할 수 있다.
infix fun Int.strPlus (x: String): String {
    return "$x version $this"
}

fun main() {
    val str1 = num strPlus "Kotlin" // 중위 표현법 밑과 동일결과
    val str2 = num.strPlus("Kotlin")
}

재귀 함수

  • tailrec 키워드를 사용하면 스택을 사용하지 않는다

부스트코스 코틀린강좌를 참고하였습니다.

0개의 댓글