마지막 else 브랜치가 점으로 연결되거나 이진 표현식의 일부인 경우 캐스케이드 if 식을 보고합니다.
이렇게 되면 가장 안쪽의 if-else 식만이 외부 표현식의 리시버 또는 왼쪽 피연산자가 되어 의도한 로직과 다를 수 있기 때문에 예상치 못한 동작이 발생할 수 있습니다.
예:
fun printNumberSign(num: Int) {
if (num > 0) {
"positive"
} else if (num < 0) {
"negative"
} else {
"zero"
}.let { print(it) }
}
fun main() {
printNumberSign(1) // 'let'의 리시버는 내부 'if-else' 식뿐이므로 아무것도 출력되지 않습니다
}
첫 번째 빠른 수정 적용 후(when으로 변환):
fun printNumberSign(num: Int) {
when {
num > 0 -> {
"positive"
}
num < 0 -> {
"negative"
}
else -> {
"zero"
}
}.let { print(it) }
}
fun main() {
printNumberSign(1) // 'positive'를 출력합니다
}
또는 두 번째 빠른 수정으로, 중첩된 else 브랜치를 명시적으로 만들면서 원래의 의미를 유지하기 위해 구분하는 중괄호를 추가합니다.
fun printNumberSign(num: Int) {
if (num > 0) {
"positive"
} else {
if (num < 0) {
"negative"
} else {
"zero"
}.let { print(it) }
}
}
fun main() {
printNumberSign(1) // 아무것도 출력되지 않지만 코드는 더 명확합니다
}