개발

[Scala] lazy val을 써야하는 경우

우리로 2021. 6. 7. 17:40

val는 변수가 선언될 당시 실행되고 lazy val은 해당 변수에 접근할 때 실행된다.

 

def factorial(n:Int):Unit  = {
    val cc =  bb(n,1)
    
    def bb(n:Int, acc:Int): Int = {
      if (true) 5
      else 3
    }
  }

다음과 같이 선언하면

forward reference extends over definition of value cc

이런 에러 메시지를 볼 수 있다. val cc를 lazy val cc로 교체하면 컴파일은 성공한다. 

 

def factorial(n:Int):Unit  = {
    lazy val cc =  bb(n,1)
    def bb(n:Int, acc:Int): Int = {
      if (true) 5
      else 3
    }
  }

 

그렇다면 다음과 같은 코드는 어떤 결과가 나올까?

def factorial(n:Int):Unit  = {
    return bb(n,1)
    def bb(n:Int, acc:Int): Int = {
      if (true) 5
      else 3
    }
  }

컴파일은 성공할까? 실행은 될까?

실제로 컴파일은 성공한다. 하지만 보다시피 return 값은 Unit이다. 그렇다면 함수는 실행되지않은걸까?

 

def factorial(n:Int):Unit  = {
    return bb(n,1)
    def bb(n:Int, acc:Int): Int = {
      println("bb Starts")
      if (true) 5
      else 3
    }
  }
  def main(args: Array[String]): Unit = {
    println("factorial", factorial(21))
  }

// Output : 
// bb Starts
// (factorial,())

함수는 정상적으로 실행됐지만, return 값은 존재하지 않는다. 참 괴랄한 일이다.