다음 예제의 ordinal()은 독일어로 된 기수(수량을 세는 단어)로부터 서수(순서를 세는 단어)를 얻는다. 아래 코드는 정수를 미리 정해진 몇 가지 수와 비교해서 일반적인 규칙을 적용할지, 예외 규칙을 적용할지 검사한다(독일어에서는 고통스럽게도 예외 규칙을 적용해야 하는 경우가 흔하다).

    WhenExpressions/GermanOrdinals.kt

    package whenexpressions
    import atomictest.eq
    
    val numbers = mapOf(
      1 to "eins", 2 to "zwei", 3 to "drei",
      4 to "vier", 5 to "fuenf", 6 to "sechs",
      7 to "sieben", 8 to "acht", 9 to "neun",
      10 to "zehn", 11 to "elf", 12 to "zwoelf",
      13 to "dreizehn", 14 to "vierzehn",
      15 to "fuenfzehn", 16 to "sechzehn",
      17 to "siebzehn", 18 to "achtzehn",
      19 to "neunzehn", 20 to "zwanzig"
    )
    
    fun ordinal(i: Int): String =
      when (i) {                           // [1]
        1 -> "erste"                       // [2]
        3 -> "dritte"
        7 -> "siebte"
        8 -> "achte"
        20 -> "zwanzigste"
        else -> numbers.getValue(i) + "te" // [3]
      }
    
    fun main() {
      ordinal(2) eq "zweite"
      ordinal(3) eq "dritte"
      ordinal(11) eq "elfte"
    }

    [1] when 식은 i를 본문의 매치식과 비교한다.

    [2] 가장 먼저 일치하는 매치식에서 when 식의 실행이 끝난다. 여기서는 String 값이 생성되며, 이 값이 ordinal()의 반환값이 된다.

    [3] else 키워드는 일치하는 매치식이 없을 때 대안으로 사용할 식을 제공한다. else는 항상 매치 목록의 맨 마지막에 있어야 한다. 2를 사용해 테스트한 경우, 이 값은 1, 3, 7, 8, 20과 일치하지 않으므로 else가 선택된다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.