[코틀린인액션] if 와 when 사용

fun eval(e: Expr): Int {
    if (e is Num) {
        return e.value
    } else if (e is Sum) {
        return eval(e.left) + eval(e.right)
    } else {
        throw IllegalArgumentException("Unknown expression")
    }
}
  • 위는 if 식으로 사용한 경우

  • when 으로 리팩토링 한 경우
fun eval(e: Expr): Int =
    when (e) {
        is Num -> e.value
        is Sum -> eval(e.left) + eval(e.right)
        else -> throw IllegalArgumentException("Unknown expression")
    }
  • when 식은 타입 검사와 스마트 캐스프를 사용해 각 케이스를 처리하게 된다.
  • 해당 코드는 if 식과 동일한 로직을 더 간결히 표현가능하다!
fun eval(e: Expr): Int =
    when (e) {
        is Num -> {
            e.value
        }
        
        is Sum -> eval(e.left) + eval(e.right)
        else -> throw IllegalArgumentException("Unknown expression")
    }
  • 람다식이라 블럭 처리도 가능하다.

    왠지 모르게 Mockito 에서 BDDMockito 를 사용하는 이유가 뭔가 비슷하지 않나 생각이 들었다

    • given - when - then 의 구조에서
      • when() 을 given 위치에 쓰는 행위 자체가 이질감이 들었는데
    • switch 라는 문법을 모르는 사람이 보면 이해할 수 없는 구조에서
      • when 이라는 사람이 조금 더 이해하기 쉬운 구조의 고수준의 언어가 된 것 같다는 착각…?
    • 또한 else 처리도 보면
      • default 라는 기계같은 분기에서
      • else 라는 인간적인 느낌의 문법으로 변화한거같다.

Uploaded by N2T