관리 메뉴

너와 나의 스토리

[Kotlin] 재귀 함수 값(val) 사용하기, 재귀 함수 초기화 문제 해결 by lazy 본문

Programming Language/Kotlin

[Kotlin] 재귀 함수 값(val) 사용하기, 재귀 함수 초기화 문제 해결 by lazy

노는게제일좋아! 2021. 9. 6. 09:08
반응형

재귀 함수 값 사용하기

  • 팩토리얼 함수를 구현한다고 해보자.
  • 다음과 같이 재귀 함수를 정의하는 것은 쉽다.
    • fun factorial(n: Int): Int {
          return if (n <= 1) {
              n
          } else {
              n * factorial(n - 1)
          }
      }
       
  • 이를 재귀 함수 값으로 만들어 보자.
    • val factorial: (Int) -> Int = { n -> if (n <= 1) n else n * factorial(n - 1) }
    • 맞게 구현한 것처럼 보이지만 factorial(n-1) 재귀 호출하는 부분에서 factorial이 initialized(초기화)되어야 한다고 컴파일 에러가 발생한다.
    • Why?
      • factorial(n-1)을 호출하는 부분에서는 아직 factorial이 정의되지 않은 상태이기 때문이다.
    • 해결책
      • lateinit 또는 by lazy를 사용해 문제를 해결할 수 있다.
      • lateinit 사용하기
        • object Factorial {
              lateinit var factorial: (Int) -> Int
          
              init {
                  factorial = { n -> if (n <= 1) n else n * factorial(n - 1) }
              }
          }
        • 이 경우, var을 사용해야하는 문제점이 있다.
      • by lazy 사용하기
        • val factorial: (Int) -> Int by lazy {{ n:Int -> if (n <= 1) n else n * factorial(n - 1) }}
        • 이렇게 정의하는 경우 초기화 문제가 생기지 않는다. 
        • 또한 val을 사용할 수 있기 때문에 이상적인 형태라고 볼 수 있다.

 

반응형
Comments