[Kotlin] 함수란 무엇인가

yellowsunn·2022년 3월 6일
0

순수 함수

순수함수는 값을 반환하기만 하고 다른일은 하지 않아야 한다.

순수 함수 조건

  • 함수 외부의 어떤 것도 변이시켜서는 안된다. 내부에서 상태를 변이시키더라도 그 상태를 외부에서 관찰할 수 없어야 한다.
  • 인자를 변이시켜서는 안 된다.
  • 예외나 오류를 던져서는 안된다.
  • 항상 값을 반환해야 한다.
  • 인자가 같으면 항상 같은 결과를 내놓아야 한다.
var percent1 = 5
fun applyTax1(a: Int): Int = a / 100 * (100 + percent1)

applyTax1 메서드는 결과가 percent1 값에 따라 달라지기 때문에 순수함수가 아니다.

percent1 을 함수 안에서 단 한번만 사용한다면 이를 암시적 파라미터로 생각해도 문제가 없지만, percent1 값을 여러번 사용한다면 반드시 그 값을 지역 변수에 보관해야 한다.

함수 값 사용하기

코틀린은 함수를 데이터처럼 다룰 수 있다. 함수를 일치하는 타임의 참조에 대입할 수 있다.

//fun 함수
fun double(x: Int): Int = x * 2
//함수 타입
val double: (Int) -> Int = { x -> x * 2 }

코틀린은 위처럼 함수가 두 종류가 있다.

fun으로 정의한 함수는 실제로는 함수가 아니라 메서드, 하위 프로그램, 프로시저 등으로 부를 수 있다. fun으로 정의한 함수로 순수 함수를 표현할 수 있지만, 이름 데이터처럼 취급할 수는 없다.

인자를 넘기고 그 인자에 따른 반환 값을 얻는 일만 하는 경우에는 fun으로 정의한 함수를 사용하는 것이 효율 적이다.

한편 함수를 데이터처럼 취급해야 하거나 함수에서 함수를 돌려줘야 하는 경우이거나 변수, 맵 그 밖의 데이터 구조에 함수를 저장해야 하는 경우라면 함수 타입의 식을 사용한다.

커리(Curry)한 함수

커리한 함수는 인자가 하나뿐이며 인자가 하나뿐인 다른 함수를 반환하는 함수이다. 이때 반환하는 함수도 마찬가지로 인자가 하나뿐인 다른 함수를 반환하는 함수일 수 있다. 이런 과정이 결과 값을 반환할 때 까지 반복된다.

val taxRate = 0.09

val addTax = { taxRate: Double ->
    { price: Double ->
        price + price * taxRate
    }
}

println(addTax(taxRate)(12.0))

fun 함수는 값이 아니기 때문에 반환할 수 없으므로 반환하는 함수는 반드시 함수 값을 사용해야 한다.

[출처] 코틀린을 다루는 기술

0개의 댓글