개발
[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 값은 존재하지 않는다. 참 괴랄한 일이다.