더북(TheBook)

다음 예제의 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가 선택된다.

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