이 코드에서 when의 조건은 한 가지 값인 n을 대상으로 하는 동등성, in, !in뿐이다. 모든 가지에서 연산의 대상이 n뿐이므로 이런 경우 다음과 같이 다시 쓸 수 있다.
fun numberDescription(n: Int, max: Int = 100): String = when (n) { 0 -> "Zero" 1, 2, 3 -> "Small" in 4..9 -> "Medium" in 10..max -> "Large" !in Int.MIN_VALUE until 0 -> "Negative" else -> "Huge" }
IDE 팁 ≡
인텔리J 코틀린 플러그인은 한 형태의 when 식을 다른 형태로 변환하면서 연산 대상을 필요에 따라 넣어주거나 없애줄 수 있다. when 키워드에 캐럿을 위치시키고 Alt + Enter를 누른 후, when의 대상 값을 추가해주는 Introduce ... as subject of when이나 대상 값을 없애주는 Eliminate argument of when을 선택하면 된다.
이러한 형태의 when 문은 when의 대상이 있다는 점으로부터 앞에서 본 when 식과 구분할 수 있다. 대상은 when 뒤에 오며 괄호로 둘러싸여 있다. when 문의 각 가지에는 in/!in이 오거나 임의의 식이 오거나 else 키워드가 올 수 있다(그리고 8장 클래스 계층 이해하기에서 다루게 될 is와 !is도 올 수 있다). when 문을 실행하는 방법은 앞에서 본 첫 번째 형식의 when과 비슷하며 다음과 같다.
• 대상 식을 평가한다. 이렇게 계산한 값이 subj라고 하자.
• 프로그램은 최초로 참인 조건을 찾을 때까지 각 가지의 조건을 코드에 나온 순서대로 평가한다. 이때 in/!in 가지는 subj가 왼쪽 피연산자인 식으로 취급하고, 임의의 식 e는 subj = e로 취급한다.
• 참인 조건을 찾으면 그 가지의 문장을 실행한다. 참인 조건이 없으면 (else 가지가 있는 경우) else 가지의 문장을 실행한다.