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 값은 존재하지 않는다. 참 괴랄한 일이다.
'개발' 카테고리의 다른 글
[Scala] if true 1 else false 의 타입은 뭘까? (0) | 2021.06.20 |
---|---|
[Scala] Call-by-value 와 Call-by-name (0) | 2021.06.13 |
[Scala] 순수함수와 참조투명성, 치환모형 (0) | 2021.06.07 |
[Scala] 함수 컴비네이터 (0) | 2021.06.01 |
2021 카카오 블라인드 공채 - 카카오 엔터프라이즈 후기 (8) | 2020.11.23 |